import mobileinit from './mobile'
import luckysheetConfigsetting from './luckysheetConfigsetting'
import luckysheetFreezen from './freezen'
import pivotTable from './pivotTable'
import luckysheetDropCell from './dropCell'
import luckysheetPostil from './postil'
import imageCtrl from './imageCtrl'
import hyperlinkCtrl from './hyperlinkCtrl'
import dataVerificationCtrl from './dataVerificationCtrl'
import menuButton from './menuButton'
import conditionformat from './conditionformat'
import alternateformat from './alternateformat'
import ifFormulaGenerator from './ifFormulaGenerator'
import sheetmanage from './sheetmanage'
import server from './server'
import { luckysheetupdateCell } from './updateCell'
import { luckysheet_searcharray } from './sheetSearch'
import luckysheetsizeauto from './resize'
import { luckysheetMoveHighlightCell } from './sheetMove'
import {
  selectHightlightShow,
  selectIsOverlap,
  selectionCopyShow,
  luckysheet_count_show,
  selectHelpboxFill,
} from './select'
import selection from './selection'
import controlHistory from './controlHistory'
import splitColumn from './splitColumn'
import { hideMenuByCancel } from '../global/cursorPos'
import { setRangeShow, exitEditMode } from '../global/api'
import { luckysheetdefaultstyle } from './constant'
import {
  checkProtectionLockedRangeList,
  checkProtectionAllSelected,
  checkProtectionSelectLockedOrUnLockedCells,
  checkProtectionNotEnable,
  checkProtectionAuthorityNormal,
} from './protection'
import { openCellFormatModel } from './cellFormat'

import {
  replaceHtml,
  getObjType,
  chatatABC,
  ArrayUnique,
  showrightclickmenu,
  luckysheetactiveCell,
  luckysheetContainerFocus,
  $$,
} from '../utils/util'
import { getSheetIndex, getRangetxt } from '../methods/get'
import { rowLocation, colLocation, mouseposition } from '../global/location'
import { rowlenByRange } from '../global/getRowlen'
import {
  isRealNull,
  hasPartMC,
  isEditMode,
  checkIsAllowEdit,
} from '../global/validate'
import { countfunc } from '../global/count'
import browser from '../global/browser'
import formula from '../global/formula'
import { luckysheetextendtable } from '../global/extend'
import luckysheetscrollevent from '../global/scroll'
import {
  jfrefreshgrid,
  jfrefreshgrid_rhcw,
  luckysheetrefreshgrid,
} from '../global/refresh'
import { getdatabyselection, datagridgrowth } from '../global/getdata'
import tooltip from '../global/tooltip'
import editor from '../global/editor'
import { genarate } from '../global/format'
import method from '../global/method'
import { getBorderInfoCompute } from '../global/border'
import { luckysheetDrawMain } from '../global/draw'
import locale from '../locale/locale'
import Store from '../store'
import {
  createLuckyChart,
  hideAllNeedRangeShow,
} from '../expendPlugins/chart/plugin'

//, columeflowset, rowflowset
export default function luckysheetHandler() {
  const os = browser.detectOS(),
    isMobile = browser.mobilecheck()

  //移动端
  if (isMobile) {
    mobileinit()
  }
  if (!Date.now)
    Date.now = function () {
      return new Date().getTime()
    }
      //requestAnimationFrame method
      ; (function () {
        'use strict'

        var vendors = ['webkit', 'moz']
        for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
          var vp = vendors[i]
          window.requestAnimationFrame = window[vp + 'RequestAnimationFrame']
          window.cancelAnimationFrame =
            window[vp + 'CancelAnimationFrame'] ||
            window[vp + 'CancelRequestAnimationFrame']
        }
        if (
          /iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) || // iOS6 is buggy
          !window.requestAnimationFrame ||
          !window.cancelAnimationFrame
        ) {
          var lastTime = 0
          window.requestAnimationFrame = function (callback) {
            var now = Date.now()
            var nextTime = Math.max(lastTime + 16, now)
            return setTimeout(function () {
              callback((lastTime = nextTime))
            }, nextTime - now)
          }
          window.cancelAnimationFrame = clearTimeout
        }
      })()

  $('#luckysheet-sheet-container-c').mousewheel(function (event, delta) {
    let scrollNum = event.deltaFactor < 40 ? 1 : event.deltaFactor < 80 ? 2 : 3
    let scrollLeft = $(this).scrollLeft()
    if (event.deltaY != 0) {
      if (event.deltaY < 0) {
        scrollLeft = scrollLeft + 10 * scrollNum
      } else {
        scrollLeft = scrollLeft - 10 * scrollNum
      }
    } else if (event.deltaX != 0) {
      if (event.deltaX > 0) {
        scrollLeft = scrollLeft + 10 * scrollNum
      } else {
        scrollLeft = scrollLeft - 10 * scrollNum
      }
    }
    $(this).scrollLeft(scrollLeft)
    event.preventDefault()
  })

  //滚动监听
  $('#luckysheet-cell-main')
    .scroll(function () { })
    .mousewheel(function (event, delta) {
      event.preventDefault()
    })

  const _locale = locale()
  const locale_drag = _locale.drag
  const locale_info = _locale.info
  let prev, mousewheelArrayUniqueTimeout
  $('#luckysheet-grid-window-1').mousewheel(function (event, delta) {
    let scrollLeft = $('#luckysheet-scrollbar-x').scrollLeft(),
      scrollTop = $('#luckysheet-scrollbar-y').scrollTop()
    let visibledatacolumn_c = Store.visibledatacolumn,
      visibledatarow_c = Store.visibledatarow

    if (luckysheetFreezen.freezenhorizontaldata != null) {
      visibledatarow_c = luckysheetFreezen.freezenhorizontaldata[3]
    }

    if (luckysheetFreezen.freezenverticaldata != null) {
      visibledatacolumn_c = luckysheetFreezen.freezenverticaldata[3]
    }

    clearTimeout(mousewheelArrayUniqueTimeout)

    // if(Store.visibledatacolumn.length!=visibledatacolumn_c.length){
    if (Store.visibledatacolumn_unique != null) {
      visibledatacolumn_c = Store.visibledatacolumn_unique
    } else {
      visibledatacolumn_c = ArrayUnique(visibledatacolumn_c)
      Store.visibledatacolumn_unique = visibledatacolumn_c
    }
    // }

    // if(Store.visibledatarow.length!=visibledatarow_c.length){
    if (Store.visibledatarow_unique != null) {
      visibledatarow_c = Store.visibledatarow_unique
    } else {
      visibledatarow_c = ArrayUnique(visibledatarow_c)
      Store.visibledatarow_unique = visibledatarow_c
    }
    // }

    // visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);
    // visibledatarow_c = ArrayUnique(visibledatarow_c);

    let col_st = luckysheet_searcharray(visibledatacolumn_c, scrollLeft)
    let row_st = luckysheet_searcharray(visibledatarow_c, scrollTop)

    if (luckysheetFreezen.freezenhorizontaldata != null) {
      row_st = luckysheet_searcharray(
        visibledatarow_c,
        scrollTop + luckysheetFreezen.freezenhorizontaldata[0]
      )
    }

    let colscroll = 0
    let rowscroll = 0

    let scrollNum = event.deltaFactor < 40 ? 1 : event.deltaFactor < 80 ? 2 : 3
    //一次滚动三行或三列
    if (event.deltaY != 0) {
      let row_ed,
        step = Math.round(scrollNum / Store.zoomRatio)
      step = step < 1 ? 1 : step
      if (event.deltaY < 0) {
        row_ed = row_st + step

        if (row_ed >= visibledatarow_c.length) {
          row_ed = visibledatarow_c.length - 1
        }
      } else {
        row_ed = row_st - step

        if (row_ed < 0) {
          row_ed = 0
        }
      }

      rowscroll = row_ed == 0 ? 0 : visibledatarow_c[row_ed - 1]

      if (luckysheetFreezen.freezenhorizontaldata != null) {
        rowscroll -= luckysheetFreezen.freezenhorizontaldata[0]
      }

      $('#luckysheet-scrollbar-y').scrollTop(rowscroll)
    } else if (event.deltaX != 0) {
      let col_ed

      // if((isMac && event.deltaX >0 ) || (!isMac && event.deltaX < 0)){
      if (event.deltaX > 0) {
        scrollLeft = scrollLeft + 20 * Store.zoomRatio

        // if(col_ed >= visibledatacolumn_c.length){
        //     col_ed = visibledatacolumn_c.length - 1;
        // }
      } else {
        scrollLeft = scrollLeft - 20 * Store.zoomRatio

        // if(col_ed < 0){
        //     col_ed = 0;
        // }
      }

      // colscroll = col_ed == 0 ? 0 : visibledatacolumn_c[col_ed - 1];

      $('#luckysheet-scrollbar-x').scrollLeft(scrollLeft)
    }

    mousewheelArrayUniqueTimeout = setTimeout(() => {
      Store.visibledatacolumn_unique = null
      Store.visibledatarow_unique = null
    }, 500)
  })

  $('#luckysheet-scrollbar-x')
    .scroll(function () {
      // setTimeout(function(){
      luckysheetscrollevent()
      // },10);
    })
    .mousewheel(function (event, delta) {
      event.preventDefault()
    })

  $('#luckysheet-scrollbar-y')
    .scroll(function () {
      // setTimeout(function(){
      luckysheetscrollevent()
      // },10);
    })
    .mousewheel(function (event, delta) {
      event.preventDefault()
    })

  //页面resize
  $(window).resize(function () {
    let luckysheetDocument = document.getElementById(Store.container)
    if (luckysheetDocument) {
      luckysheetsizeauto()
    }
  })

  $('#luckysheet-rich-text-editor').mouseup(function (e) {
    menuButton.inputMenuButtonFocus(e.target)
  })

  //表格mousedown
  $('#luckysheet-cell-main, #luckysheetTableContent')
    .mousedown(function (event) {
      if ($(event.target).hasClass('luckysheet-mousedown-cancel')) {
        return
      }

      // 协同编辑其他用户不在操作的时候，用户名框隐藏
      hideUsername()

      $('#luckysheet-cell-selected')
        .find('.luckysheet-cs-fillhandle')
        .css('cursor', 'default')
        .end()
        .find('.luckysheet-cs-draghandle')
        .css('cursor', 'default')
      $(
        '#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0'
      ).css('cursor', 'default')

      //有批注在编辑时
      luckysheetPostil.removeActivePs()

      //图片 active/cropping
      if (
        $('#luckysheet-modal-dialog-activeImage').is(':visible') ||
        $('#luckysheet-modal-dialog-cropping').is(':visible')
      ) {
        imageCtrl.cancelActiveImgItem()
      }

      //luckysheetautoadjustmousedown = 1;
      let mouse = mouseposition(event.pageX, event.pageY)
      if (
        mouse[0] >= Store.cellmainWidth - Store.cellMainSrollBarSize ||
        mouse[1] >= Store.cellmainHeight - Store.cellMainSrollBarSize
      ) {
        return
      }

      let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
      let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

      if (
        luckysheetFreezen.freezenverticaldata != null &&
        mouse[0] <
        luckysheetFreezen.freezenverticaldata[0] -
        luckysheetFreezen.freezenverticaldata[2]
      ) {
        x = mouse[0] + luckysheetFreezen.freezenverticaldata[2]
      }

      if (
        luckysheetFreezen.freezenhorizontaldata != null &&
        mouse[1] <
        luckysheetFreezen.freezenhorizontaldata[0] -
        luckysheetFreezen.freezenhorizontaldata[2]
      ) {
        y = mouse[1] + luckysheetFreezen.freezenhorizontaldata[2]
      }

      let sheetFile = sheetmanage.getSheetByIndex()
      let luckysheetTableContent = $('#luckysheetTableContent')
        .get(0)
        .getContext('2d')

      let row_location = rowLocation(y),
        row = row_location[1],
        row_pre = row_location[0],
        row_index = row_location[2]

      let col_location = colLocation(x),
        col = col_location[1],
        col_pre = col_location[0],
        col_index = col_location[2]

      let row_index_ed = row_index,
        col_index_ed = col_index
      let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index)
      if (!!margeset) {
        row = margeset.row[1]
        row_pre = margeset.row[0]
        row_index = margeset.row[2]
        row_index_ed = margeset.row[3]

        col = margeset.column[1]
        col_pre = margeset.column[0]
        col_index = margeset.column[2]
        col_index_ed = margeset.column[3]
      }
      // debugger
      console.log(Store.luckysheet_select_save)
      let last =
            Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
            ]
          // let row_index = last['row_focus'],
          //   col_index = last['column_focus']
          //获取当前选中表格的数据，判断是否表头，获取dbMark的key然后判断是否存在
          console.log(Store.dbMark)
          console.log(Store.flowdata[row_index][col_index])
          if(Store.dbMark&&Store.flowdata){
            const heads = Object.keys(Store.dbMark)
            let now = (Number(row_index) + 1) + '_' + col_index
                if (heads.includes(now)) {
                  return false
                }
          }
         
      // if (Store.designData.end_r > r) {
      //   return
      // }
      // return
      //单元格单击之前
      if (
        !method.createHookFunction(
          'cellMousedownBefore',
          Store.flowdata[row_index][col_index],
          {
            r: row_index,
            c: col_index,
            start_r: row_pre,
            start_c: col_pre,
            end_r: row,
            end_c: col,
          },
          sheetFile,
          luckysheetTableContent
        )
      ) {
        return
      }

      //数据验证 单元格聚焦
      dataVerificationCtrl.cellFocus(row_index, col_index, true)

      //若点击单元格部分不在视图内
      if (col_pre < $('#luckysheet-cell-main').scrollLeft()) {
        $('#luckysheet-scrollbar-x').scrollLeft(col_pre)
      }

      if (row_pre < $('#luckysheet-cell-main').scrollTop()) {
        $('#luckysheet-scrollbar-y').scrollTop(row_pre)
      }

      //mousedown是右键
      if (event.which == '3') {
        $('#luckysheet-dataVerification-showHintBox').hide()

        let isright = false

        for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
          if (
            Store.luckysheet_select_save[s]['row'] != null &&
            row_index >= Store.luckysheet_select_save[s]['row'][0] &&
            row_index <= Store.luckysheet_select_save[s]['row'][1] &&
            col_index >= Store.luckysheet_select_save[s]['column'][0] &&
            col_index <= Store.luckysheet_select_save[s]['column'][1]
          ) {
            isright = true
            break
          }
        }

        if (isright) {
          return
        }
      }

      //单元格数据下钻
      if (
        Store.flowdata[row_index] != null &&
        Store.flowdata[row_index][col_index] != null &&
        Store.flowdata[row_index][col_index].dd != null
      ) {
        if (
          luckysheetConfigsetting.fireMousedown != null &&
          getObjType(luckysheetConfigsetting.fireMousedown) == 'function'
        ) {
          luckysheetConfigsetting.fireMousedown(
            Store.flowdata[row_index][col_index].dd
          )
          return
        }
      }

      //链接 单元格聚焦
      if (
        hyperlinkCtrl.hyperlink &&
        hyperlinkCtrl.hyperlink[row_index + '_' + col_index] &&
        event.which != '3'
      ) {
        hyperlinkCtrl.cellFocus(row_index, col_index)
        return
      }

      Store.luckysheet_scroll_status = true

      //公式相关
      let $input = $('#luckysheet-input-box')
      if (parseInt($input.css('top')) > 0) {
        if (
          formula.rangestart ||
          formula.rangedrag_column_start ||
          formula.rangedrag_row_start ||
          formula.israngeseleciton()
        ) {
          //公式选区
          let rowseleted = [row_index, row_index_ed]
          let columnseleted = [col_index, col_index_ed]

          let left = col_pre
          let width = col - col_pre - 1
          let top = row_pre
          let height = row - row_pre - 1

          if (event.shiftKey) {
            let last = formula.func_selectedrange

            let top = 0,
              height = 0,
              rowseleted = []
            if (last.top > row_pre) {
              top = row_pre
              height = last.top + last.height - row_pre

              if (last.row[1] > last.row_focus) {
                last.row[1] = last.row_focus
              }

              rowseleted = [row_index, last.row[1]]
            } else if (last.top == row_pre) {
              top = row_pre
              height = last.top + last.height - row_pre
              rowseleted = [row_index, last.row[0]]
            } else {
              top = last.top
              height = row - last.top - 1

              if (last.row[0] < last.row_focus) {
                last.row[0] = last.row_focus
              }

              rowseleted = [last.row[0], row_index]
            }

            let left = 0,
              width = 0,
              columnseleted = []
            if (last.left > col_pre) {
              left = col_pre
              width = last.left + last.width - col_pre

              if (last.column[1] > last.column_focus) {
                last.column[1] = last.column_focus
              }

              columnseleted = [col_index, last.column[1]]
            } else if (last.left == col_pre) {
              left = col_pre
              width = last.left + last.width - col_pre
              columnseleted = [col_index, last.column[0]]
            } else {
              left = last.left
              width = col - last.left - 1

              if (last.column[0] < last.column_focus) {
                last.column[0] = last.column_focus
              }

              columnseleted = [last.column[0], col_index]
            }

            let changeparam = menuButton.mergeMoveMain(
              columnseleted,
              rowseleted,
              last,
              top,
              height,
              left,
              width
            )
            if (changeparam != null) {
              columnseleted = changeparam[0]
              rowseleted = changeparam[1]
              top = changeparam[2]
              height = changeparam[3]
              left = changeparam[4]
              width = changeparam[5]
            }

            luckysheet_count_show(
              left,
              top,
              width,
              height,
              rowseleted,
              columnseleted
            )

            last['row'] = rowseleted
            last['column'] = columnseleted

            last['left_move'] = left
            last['width_move'] = width
            last['top_move'] = top
            last['height_move'] = height

            formula.func_selectedrange = last
          } else if (
            event.ctrlKey &&
            $('#luckysheet-rich-text-editor')
              .find('span')
              .last()
              .text() != ','
          ) {
            //按住ctrl 选择选区时  先处理上一个选区
            let vText = $('#luckysheet-rich-text-editor').text()

            if (vText[vText.length - 1] === ')') {
              vText = vText.substr(0, vText.length - 1) //先删除最后侧的圆括号)
            }

            if (vText.length > 0) {
              let lastWord = vText.substr(vText.length - 1, 1)
              if (lastWord != ',' && lastWord != '=' && lastWord != '(') {
                vText += ','
              }
            }
            if (vText.length > 0 && vText.substr(0, 1) == '=') {
              vText = formula.functionHTMLGenerate(vText)

              if (window.getSelection) {
                // all browsers, except IE before version 9
                let currSelection = window.getSelection()
                formula.functionRangeIndex = [
                  $(currSelection.anchorNode)
                    .parent()
                    .index(),
                  currSelection.anchorOffset,
                ]
              } else {
                // Internet Explorer before version 9
                let textRange = document.selection.createRange()
                formula.functionRangeIndex = textRange
              }

              /* 在显示前重新 + 右侧的圆括号) */

              $('#luckysheet-rich-text-editor').html(vText + ')')

              formula.canceFunctionrangeSelected()
              formula.createRangeHightlight()
            }

            formula.rangestart = false
            formula.rangedrag_column_start = false
            formula.rangedrag_row_start = false

            $('#luckysheet-functionbox-cell').html(vText + ')')
            formula.rangeHightlightselected($('#luckysheet-rich-text-editor'))

            //再进行 选区的选择
            formula.israngeseleciton()
            formula.func_selectedrange = {
              left: left,
              width: width,
              top: top,
              height: height,
              left_move: left,
              width_move: width,
              top_move: top,
              height_move: height,
              row: rowseleted,
              column: columnseleted,
              row_focus: row_index,
              column_focus: col_index,
            }
          } else {
            formula.func_selectedrange = {
              left: left,
              width: width,
              top: top,
              height: height,
              left_move: left,
              width_move: width,
              top_move: top,
              height_move: height,
              row: rowseleted,
              column: columnseleted,
              row_focus: row_index,
              column_focus: col_index,
            }
          }

          formula.rangeSetValue({ row: rowseleted, column: columnseleted })

          formula.rangestart = true
          formula.rangedrag_column_start = false
          formula.rangedrag_row_start = false

          $('#luckysheet-formula-functionrange-select')
            .css({
              left: left,
              width: width,
              top: top,
              height: height,
            })
            .show()
          $('#luckysheet-formula-help-c').hide()
          luckysheet_count_show(
            left,
            top,
            width,
            height,
            rowseleted,
            columnseleted
          )

          setTimeout(function () {
            let currSelection = window.getSelection()
            let anchorOffset = currSelection.anchorNode

            let $editor
            if (
              $('#luckysheet-search-formula-parm').is(':visible') ||
              $('#luckysheet-search-formula-parm-select').is(':visible')
            ) {
              $editor = $('#luckysheet-rich-text-editor')
              formula.rangechangeindex = formula.data_parm_index
            } else {
              $editor = $(anchorOffset).closest('div')
            }

            let $span = $editor.find(
              "span[rangeindex='" + formula.rangechangeindex + "']"
            )

            formula.setCaretPosition($span.get(0), 0, $span.html().length)
          }, 1)
          return
        } else {
          formula.updatecell(
            Store.luckysheetCellUpdate[0],
            Store.luckysheetCellUpdate[1]
          )
          Store.luckysheet_select_status = true

          if ($('#luckysheet-info').is(':visible')) {
            Store.luckysheet_select_status = false
          }
        }
      } else {
        if (
          checkProtectionSelectLockedOrUnLockedCells(
            row_index,
            col_index,
            Store.currentSheetIndex
          )
        ) {
          Store.luckysheet_select_status = true
        }
      }

      //条件格式 应用范围可选择多个单元格
      if ($('#luckysheet-multiRange-dialog').is(':visible')) {
        conditionformat.selectStatus = true
        Store.luckysheet_select_status = false

        if (event.shiftKey) {
          let last =
            conditionformat.selectRange[conditionformat.selectRange.length - 1]

          let top = 0,
            height = 0,
            rowseleted = []
          if (last.top > row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre

            if (last.row[1] > last.row_focus) {
              last.row[1] = last.row_focus
            }

            rowseleted = [row_index, last.row[1]]
          } else if (last.top == row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre
            rowseleted = [row_index, last.row[0]]
          } else {
            top = last.top
            height = row - last.top - 1

            if (last.row[0] < last.row_focus) {
              last.row[0] = last.row_focus
            }

            rowseleted = [last.row[0], row_index]
          }

          let left = 0,
            width = 0,
            columnseleted = []
          if (last.left > col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre

            if (last.column[1] > last.column_focus) {
              last.column[1] = last.column_focus
            }

            columnseleted = [col_index, last.column[1]]
          } else if (last.left == col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre
            columnseleted = [col_index, last.column[0]]
          } else {
            left = last.left
            width = col - last.left - 1

            if (last.column[0] < last.column_focus) {
              last.column[0] = last.column_focus
            }

            columnseleted = [last.column[0], col_index]
          }

          let changeparam = menuButton.mergeMoveMain(
            columnseleted,
            rowseleted,
            last,
            top,
            height,
            left,
            width
          )
          if (changeparam != null) {
            columnseleted = changeparam[0]
            rowseleted = changeparam[1]
            top = changeparam[2]
            height = changeparam[3]
            left = changeparam[4]
            width = changeparam[5]
          }

          last['row'] = rowseleted
          last['column'] = columnseleted

          last['left_move'] = left
          last['width_move'] = width
          last['top_move'] = top
          last['height_move'] = height

          conditionformat.selectRange[
            conditionformat.selectRange.length - 1
          ] = last
        } else if (event.ctrlKey) {
          conditionformat.selectRange.push({
            left: col_pre,
            width: col - col_pre - 1,
            top: row_pre,
            height: row - row_pre - 1,
            left_move: col_pre,
            width_move: col - col_pre - 1,
            top_move: row_pre,
            height_move: row - row_pre - 1,
            row: [row_index, row_index_ed],
            column: [col_index, col_index_ed],
            row_focus: row_index,
            column_focus: col_index,
          })
        } else {
          conditionformat.selectRange = []
          conditionformat.selectRange.push({
            left: col_pre,
            width: col - col_pre - 1,
            top: row_pre,
            height: row - row_pre - 1,
            left_move: col_pre,
            width_move: col - col_pre - 1,
            top_move: row_pre,
            height_move: row - row_pre - 1,
            row: [row_index, row_index_ed],
            column: [col_index, col_index_ed],
            row_focus: row_index,
            column_focus: col_index,
          })
        }

        selectionCopyShow(conditionformat.selectRange)

        let range = conditionformat.getTxtByRange(conditionformat.selectRange)
        $('#luckysheet-multiRange-dialog input').val(range)

        return
      } else {
        conditionformat.selectStatus = false
        conditionformat.selectRange = []
      }

      //条件格式 条件值只能选择单个单元格
      if ($('#luckysheet-singleRange-dialog').is(':visible')) {
        Store.luckysheet_select_status = false

        selectionCopyShow([
          { row: [row_index, row_index], column: [col_index, col_index] },
        ])

        let range = getRangetxt(
          Store.currentSheetIndex,
          { row: [row_index, row_index], column: [col_index, col_index] },
          Store.currentSheetIndex
        )
        $('#luckysheet-singleRange-dialog input').val(range)

        return
      }

      //数据验证 单元格范围选择
      if ($('#luckysheet-dataVerificationRange-dialog').is(':visible')) {
        dataVerificationCtrl.selectStatus = true
        Store.luckysheet_select_status = false

        if (event.shiftKey) {
          let last =
            dataVerificationCtrl.selectRange[
            dataVerificationCtrl.selectRange.length - 1
            ]

          let top = 0,
            height = 0,
            rowseleted = []
          if (last.top > row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre

            if (last.row[1] > last.row_focus) {
              last.row[1] = last.row_focus
            }

            rowseleted = [row_index, last.row[1]]
          } else if (last.top == row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre
            rowseleted = [row_index, last.row[0]]
          } else {
            top = last.top
            height = row - last.top - 1

            if (last.row[0] < last.row_focus) {
              last.row[0] = last.row_focus
            }

            rowseleted = [last.row[0], row_index]
          }

          let left = 0,
            width = 0,
            columnseleted = []
          if (last.left > col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre

            if (last.column[1] > last.column_focus) {
              last.column[1] = last.column_focus
            }

            columnseleted = [col_index, last.column[1]]
          } else if (last.left == col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre
            columnseleted = [col_index, last.column[0]]
          } else {
            left = last.left
            width = col - last.left - 1

            if (last.column[0] < last.column_focus) {
              last.column[0] = last.column_focus
            }

            columnseleted = [last.column[0], col_index]
          }

          let changeparam = menuButton.mergeMoveMain(
            columnseleted,
            rowseleted,
            last,
            top,
            height,
            left,
            width
          )
          if (changeparam != null) {
            columnseleted = changeparam[0]
            rowseleted = changeparam[1]
            top = changeparam[2]
            height = changeparam[3]
            left = changeparam[4]
            width = changeparam[5]
          }

          last['row'] = rowseleted
          last['column'] = columnseleted

          last['left_move'] = left
          last['width_move'] = width
          last['top_move'] = top
          last['height_move'] = height

          dataVerificationCtrl.selectRange[
            dataVerificationCtrl.selectRange.length - 1
          ] = last
        } else {
          dataVerificationCtrl.selectRange = []
          dataVerificationCtrl.selectRange.push({
            left: col_pre,
            width: col - col_pre - 1,
            top: row_pre,
            height: row - row_pre - 1,
            left_move: col_pre,
            width_move: col - col_pre - 1,
            top_move: row_pre,
            height_move: row - row_pre - 1,
            row: [row_index, row_index_ed],
            column: [col_index, col_index_ed],
            row_focus: row_index,
            column_focus: col_index,
          })
        }

        selectionCopyShow(dataVerificationCtrl.selectRange)

        let range = dataVerificationCtrl.getTxtByRange(
          dataVerificationCtrl.selectRange
        )
        if (formula.rangetosheet != Store.currentSheetIndex) {
          range =
            Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].name +
            '!' +
            range
        }
        $('#luckysheet-dataVerificationRange-dialog input').val(range)

        return
      } else {
        dataVerificationCtrl.selectStatus = false
        dataVerificationCtrl.selectRange = []
      }

      //if公式生成器
      if (ifFormulaGenerator.singleRangeFocus) {
        $('#luckysheet-ifFormulaGenerator-dialog .singRange').click()
      }
      if (
        $('#luckysheet-ifFormulaGenerator-singleRange-dialog').is(':visible')
      ) {
        //选择单个单元格
        Store.luckysheet_select_status = false
        formula.rangestart = false

        $('#luckysheet-formula-functionrange-select')
          .css({
            left: col_pre,
            width: col - col_pre - 1,
            top: row_pre,
            height: row - row_pre - 1,
          })
          .show()
        $('#luckysheet-formula-help-c').hide()

        let range = getRangetxt(
          Store.currentSheetIndex,
          { row: [row_index, row_index], column: [col_index, col_index] },
          Store.currentSheetIndex
        )
        $('#luckysheet-ifFormulaGenerator-singleRange-dialog input').val(range)

        return
      }
      if (
        $('#luckysheet-ifFormulaGenerator-multiRange-dialog').is(':visible')
      ) {
        //选择范围
        Store.luckysheet_select_status = false
        formula.func_selectedrange = {
          left: col_pre,
          width: col - col_pre - 1,
          top: row_pre,
          height: row - row_pre - 1,
          left_move: col_pre,
          width_move: col - col_pre - 1,
          top_move: row_pre,
          height_move: row - row_pre - 1,
          row: [row_index, row_index],
          column: [col_index, col_index],
          row_focus: row_index,
          column_focus: col_index,
        }
        formula.rangestart = true

        $('#luckysheet-formula-functionrange-select')
          .css({
            left: col_pre,
            width: col - col_pre - 1,
            top: row_pre,
            height: row - row_pre - 1,
          })
          .show()
        $('#luckysheet-formula-help-c').hide()

        let range = getRangetxt(
          Store.currentSheetIndex,
          { row: [row_index, row_index], column: [col_index, col_index] },
          Store.currentSheetIndex
        )
        $('#luckysheet-ifFormulaGenerator-multiRange-dialog input').val(range)

        $('#luckysheet-row-count-show').hide()
        $('#luckysheet-column-count-show').hide()

        return
      }

      if (Store.luckysheet_select_status) {
        if (event.shiftKey) {
          //按住shift点击，选择范围
          let last = $.extend(
            true,
            {},
            Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
            ]
          ) //选区最后一个

          let top = 0,
            height = 0,
            rowseleted = []
          if (last.top > row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre

            if (last.row[1] > last.row_focus) {
              last.row[1] = last.row_focus
            }

            rowseleted = [row_index, last.row[1]]
          } else if (last.top == row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre
            rowseleted = [row_index, last.row[0]]
          } else {
            top = last.top
            height = row - last.top - 1

            if (last.row[0] < last.row_focus) {
              last.row[0] = last.row_focus
            }

            rowseleted = [last.row[0], row_index]
          }

          let left = 0,
            width = 0,
            columnseleted = []
          if (last.left > col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre

            if (last.column[1] > last.column_focus) {
              last.column[1] = last.column_focus
            }

            columnseleted = [col_index, last.column[1]]
          } else if (last.left == col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre
            columnseleted = [col_index, last.column[0]]
          } else {
            left = last.left
            width = col - last.left - 1

            if (last.column[0] < last.column_focus) {
              last.column[0] = last.column_focus
            }

            columnseleted = [last.column[0], col_index]
          }

          let changeparam = menuButton.mergeMoveMain(
            columnseleted,
            rowseleted,
            last,
            top,
            height,
            left,
            width
          )
          if (changeparam != null) {
            columnseleted = changeparam[0]
            rowseleted = changeparam[1]
            top = changeparam[2]
            height = changeparam[3]
            left = changeparam[4]
            width = changeparam[5]
          }

          last['row'] = rowseleted
          last['column'] = columnseleted

          last['left_move'] = left
          last['width_move'] = width
          last['top_move'] = top
          last['height_move'] = height

          Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
          ] = last

          //交替颜色选择范围
          if ($('#luckysheet-alternateformat-rangeDialog').is(':visible')) {
            $('#luckysheet-alternateformat-rangeDialog input').val(
              getRangetxt(Store.currentSheetIndex, Store.luckysheet_select_save)
            )
          }

          if (pivotTable.luckysheet_pivotTable_select_state) {
            $('#luckysheet-pivotTable-range-selection-input').val(
              Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
                .name +
              '!' +
              chatatABC(Store.luckysheet_select_save[0]['column'][0]) +
              (Store.luckysheet_select_save[0]['row'][0] + 1) +
              ':' +
              chatatABC(Store.luckysheet_select_save[0]['column'][1]) +
              (Store.luckysheet_select_save[0]['row'][1] + 1)
            )
          }
        } else if (event.ctrlKey) {
          //选区添加
          Store.luckysheet_select_save.push({
            left: col_pre,
            width: col - col_pre - 1,
            top: row_pre,
            height: row - row_pre - 1,
            left_move: col_pre,
            width_move: col - col_pre - 1,
            top_move: row_pre,
            height_move: row - row_pre - 1,
            row: [row_index, row_index_ed],
            column: [col_index, col_index_ed],
            row_focus: row_index,
            column_focus: col_index,
          })
        } else {
          Store.luckysheet_select_save.length = 0
          Store.luckysheet_select_save.push({
            left: col_pre,
            width: col - col_pre - 1,
            top: row_pre,
            height: row - row_pre - 1,
            left_move: col_pre,
            width_move: col - col_pre - 1,
            top_move: row_pre,
            height_move: row - row_pre - 1,
            row: [row_index, row_index_ed],
            column: [col_index, col_index_ed],
            row_focus: row_index,
            column_focus: col_index,
          })

          //单元格格式icon对应
          menuButton.menuButtonFocus(Store.flowdata, row_index, col_index)
          //函数公式显示栏
          formula.fucntionboxshow(row_index, col_index)
        }

        selectHightlightShow()

        if (
          luckysheetFreezen.freezenhorizontaldata != null ||
          luckysheetFreezen.freezenverticaldata != null
        ) {
          luckysheetFreezen.scrollAdaptOfselect()
        }

        if (!browser.mobilecheck()) {
          //非移动端聚焦输入框
          luckysheetactiveCell()
        }

        //允许编辑后的后台更新时
        server.saveParam(
          'mv',
          Store.currentSheetIndex,
          Store.luckysheet_select_save
        )
      }

      //交替颜色
      if (alternateformat.rangefocus) {
        alternateformat.rangefocus = false
        $('#luckysheet-alternateformat-range .fa-table').click()
      }

      $('#luckysheet-row-count-show, #luckysheet-column-count-show').hide()

      if (!isEditMode()) {
        //chartMix 隐藏当前页的数据选择区域高亮
        hideAllNeedRangeShow()
      }

      // selectHelpboxFill();

      //数据透视表
      pivotTable.pivotclick(row_index, col_index, Store.currentSheetIndex)

      luckysheetContainerFocus()

      method.createHookFunction(
        'cellMousedown',
        Store.flowdata[row_index][col_index],
        {
          r: row_index,
          c: col_index,
          start_r: row_pre,
          start_c: col_pre,
          end_r: row,
          end_c: col,
        },
        sheetFile,
        luckysheetTableContent
      )

      //$("#luckysheet-cols-h-c .luckysheet-cols-h-cells-c .luckysheet-cols-h-cells-clip .luckysheet-cols-h-cell-sel").removeClass("luckysheet-cols-h-cell-sel").addClass("luckysheet-cols-h-cell-nosel");

      //$("#luckysheet-rows-h .luckysheet-rows-h-cells .luckysheet-rows-h-cells-c .luckysheet-rows-h-cells-clip .luckysheet-rows-h-cell-sel").removeClass("luckysheet-rows-h-cell-sel").addClass("luckysheet-rows-h-cell-nosel");

      //$("#luckysheet-cols-h-c .luckysheet-cols-h-cells-c .luckysheet-cols-h-cells-clip .luckysheet-cols-h-cell-nosel").eq(col_index).removeClass("luckysheet-cols-h-cell-nosel").addClass("luckysheet-cols-h-cell-sel");

      //$("#luckysheet-rows-h .luckysheet-rows-h-cells .luckysheet-rows-h-cells-c .luckysheet-rows-h-cells-clip .luckysheet-rows-h-cell-nosel").eq(row_index).removeClass("luckysheet-rows-h-cell-nosel").addClass("luckysheet-rows-h-cell-sel");

      //event.stopImmediatePropagation();
    })
    .mouseup(function (event) {
      if (event.which == '3') {
        //禁止前台编辑(只可 框选单元格、滚动查看表格)
        if (!Store.allowEdit) {
          return
        }

        if (isEditMode()) {
          //非编辑模式下禁止右键功能框
          return
        }
        //luckysheetautoadjustmousedown = 1;
        // let mouse = mouseposition(event.pageX, event.pageY)
        // if (
        //   mouse[0] >= Store.cellmainWidth - Store.cellMainSrollBarSize ||
        //   mouse[1] >= Store.cellmainHeight - Store.cellMainSrollBarSize
        // ) {
        //   return
        // }
        let x = event.pageX
        let y = event.pageY

        // let xx = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
        // let yy = mouse[1] + $('#luckysheet-cell-main').scrollTop()

        // if (
        //   luckysheetFreezen.freezenverticaldata != null &&
        //   mouse[0] <
        //   luckysheetFreezen.freezenverticaldata[0] -
        //   luckysheetFreezen.freezenverticaldata[2]
        // ) {
        //   xx = mouse[0] + luckysheetFreezen.freezenverticaldata[2]
        // }

        // if (
        //   luckysheetFreezen.freezenhorizontaldata != null &&
        //   mouse[1] <
        //   luckysheetFreezen.freezenhorizontaldata[0] -
        //   luckysheetFreezen.freezenhorizontaldata[2]
        // ) {
        //   yy = mouse[1] + luckysheetFreezen.freezenhorizontaldata[2]
        // }
        let obj_s = Store.luckysheet_select_save[0]
        const cellRightClickConfig =
          luckysheetConfigsetting.cellRightClickConfig

        // let col_location = colLocation(xx)
        // let col_index = col_location[2]
        // let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index)
        // if (!!margeset) {
        //   row_index = margeset.row[2]
        //   col_index = margeset.column[2]
        // }
        //从这判断Store.flowdata[row_index][col_index]是否表头，如果是表头直接return，不执行下面的方法
        // console.log('aaaaaa', Store.flowdata[row_index][col_index])
        let last =
          Store.luckysheet_select_save[
          Store.luckysheet_select_save.length - 1
          ]
        let row_index = last['row_focus'],
          col_index = last['column_focus'];
        //获取当前选中表格的数据，判断是否表头，获取dbMark的key然后判断是否存在
        console.log(Store.dbMark)
        console.log(Store.flowdata[row_index][col_index])
        console.log((Number(row_index) + 1) + '_' + col_index)
        const heads = Object.keys(Store.dbMark)
        let now = (Number(row_index) + 1) + '_' + col_index
        if (heads.includes(now)) {
          console.log(222)
          // luckysheetupdateCell(row_index, col_index, Store.flowdata)        
          event.preventDefault()
          return false
        }
        $('#luckysheet-cols-rows-data').show()
        $('#luckysheet-cols-rows-handleincell').show()
        $('#luckysheet-cols-rows-add, #luckysheet-cols-rows-shift').hide()

        $$(
          '#luckysheet-cols-rows-data .luckysheet-menuseparator'
        ).style.display = 'block'
        $$(
          '#luckysheet-cols-rows-handleincell .luckysheet-menuseparator'
        ).style.display = 'block'

        if (
          obj_s['row'] != null &&
          obj_s['row'][0] == 0 &&
          obj_s['row'][1] == Store.flowdata.length - 1
        ) {
          // 如果全部按钮都隐藏，则整个菜单容器也要隐藏
          if (
            !cellRightClickConfig.copy &&
            !cellRightClickConfig.copyAs &&
            !cellRightClickConfig.paste &&
            !cellRightClickConfig.insertColumn &&
            !cellRightClickConfig.deleteColumn &&
            !cellRightClickConfig.hideColumn &&
            !cellRightClickConfig.columnWidth &&
            !cellRightClickConfig.clear &&
            !cellRightClickConfig.matrix &&
            !cellRightClickConfig.sort &&
            !cellRightClickConfig.filter &&
            !cellRightClickConfig.chart &&
            !cellRightClickConfig.image &&
            !cellRightClickConfig.link &&
            !cellRightClickConfig.data &&
            !cellRightClickConfig.cellFormat
          ) {
            return
          }

          Store.luckysheetRightHeadClickIs = 'column'

          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word'
          ).text(locale().rightclick.column)
          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size'
          ).text(locale().rightclick.width)
          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left'
          ).text(locale().rightclick.left)
          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right'
          ).text(locale().rightclick.right)

          $('#luckysheet-cols-rows-add').show()
          // $("#luckysheet-cols-rows-data").show();
          $('#luckysheet-cols-rows-shift').hide()
          $('#luckysheet-cols-rows-handleincell').hide()
          Store.luckysheet_cols_menu_status = true

          $$(
            '#luckysheet-cols-rows-add .luckysheet-menuseparator'
          ).style.display = 'block'

          // 自定义右键菜单：向左向右增加列，删除列，隐藏显示列，设置列宽
          $$(
            '#luckysheet-top-left-add-selected'
          ).style.display = cellRightClickConfig.insertColumn ? 'block' : 'none'
          $$(
            '#luckysheet-bottom-right-add-selected'
          ).style.display = cellRightClickConfig.insertColumn ? 'block' : 'none'
          $$(
            '#luckysheet-del-selected'
          ).style.display = cellRightClickConfig.deleteColumn ? 'block' : 'none'
          $$(
            '#luckysheet-hide-selected'
          ).style.display = cellRightClickConfig.hideColumn ? 'block' : 'none'
          $$(
            '#luckysheet-show-selected'
          ).style.display = cellRightClickConfig.hideColumn ? 'block' : 'none'
          $$(
            '#luckysheet-column-row-width-selected'
          ).style.display = cellRightClickConfig.columnWidth ? 'block' : 'none'

          // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏
          if (
            !cellRightClickConfig.copy &&
            !cellRightClickConfig.copyAs &&
            !cellRightClickConfig.paste
          ) {
            $$(
              '#luckysheet-cols-rows-add .luckysheet-menuseparator'
            ).style.display = 'none'

            if (
              !cellRightClickConfig.insertColumn &&
              !cellRightClickConfig.deleteColumn &&
              !cellRightClickConfig.hideColumn &&
              !cellRightClickConfig.columnWidth
            ) {
              $$(
                '#luckysheet-cols-rows-data .luckysheet-menuseparator'
              ).style.display = 'none'
            }
          }

          // 2.当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉
          if (
            !cellRightClickConfig.insertColumn &&
            !cellRightClickConfig.deleteColumn &&
            !cellRightClickConfig.hideColumn &&
            !cellRightClickConfig.columnWidth
          ) {
            $$(
              '#luckysheet-cols-rows-add .luckysheet-menuseparator'
            ).style.display = 'none'
          }

          //列宽默认值
          let cfg = $.extend(true, {}, Store.config)
          if (cfg['columnlen'] == null) {
            cfg['columnlen'] = {}
          }

          let first_collen =
            cfg['columnlen'][Store.luckysheet_select_save[0].column[0]] == null
              ? Store.defaultcollen
              : cfg['columnlen'][Store.luckysheet_select_save[0].column[0]]
          let isSame = true

          for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
            let s = Store.luckysheet_select_save[i]
            let c1 = s.column[0],
              c2 = s.column[1]

            for (let c = c1; c <= c2; c++) {
              let collen =
                cfg['columnlen'][c] == null
                  ? Store.defaultcollen
                  : cfg['columnlen'][c]

              if (collen != first_collen) {
                isSame = false
                break
              }
            }
          }

          if (isSame) {
            $('#luckysheet-cols-rows-add')
              .find("input[type='number'].rcsize")
              .val(first_collen)
          } else {
            $('#luckysheet-cols-rows-add')
              .find("input[type='number'].rcsize")
              .val('')
          }
        } else if (
          obj_s['column'] != null &&
          obj_s['column'][0] == 0 &&
          obj_s['column'][1] == Store.flowdata[0].length - 1
        ) {
          // 如果全部按钮都隐藏，则整个菜单容器也要隐藏
          if (
            !cellRightClickConfig.copy &&
            !cellRightClickConfig.copyAs &&
            !cellRightClickConfig.paste &&
            !cellRightClickConfig.insertRow &&
            !cellRightClickConfig.deleteRow &&
            !cellRightClickConfig.hideRow &&
            !cellRightClickConfig.rowHeight &&
            !cellRightClickConfig.clear &&
            !cellRightClickConfig.matrix &&
            !cellRightClickConfig.sort &&
            !cellRightClickConfig.filter &&
            !cellRightClickConfig.chart &&
            !cellRightClickConfig.image &&
            !cellRightClickConfig.link &&
            !cellRightClickConfig.data &&
            !cellRightClickConfig.cellFormat
          ) {
            return
          }

          Store.luckysheetRightHeadClickIs = 'row'

          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-word'
          ).text(locale().rightclick.row)
          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-size'
          ).text(locale().rightclick.height)
          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-left'
          ).text(locale().rightclick.top)
          $(
            '#luckysheet-rightclick-menu .luckysheet-cols-rows-shift-right'
          ).text(locale().rightclick.bottom)
          $('#luckysheet-cols-rows-add').show()
          // $("#luckysheet-cols-rows-data").show();
          $('#luckysheet-cols-rows-shift').hide()
          $('#luckysheet-cols-rows-handleincell').hide()
          Store.luckysheet_cols_menu_status = true

          $$(
            '#luckysheet-cols-rows-add .luckysheet-menuseparator'
          ).style.display = 'block'

          // 自定义右键菜单：向上向下增加行，删除行，隐藏显示行，设置行高
          $$(
            '#luckysheet-top-left-add-selected'
          ).style.display = cellRightClickConfig.insertRow ? 'block' : 'none'
          $$(
            '#luckysheet-bottom-right-add-selected'
          ).style.display = cellRightClickConfig.insertRow ? 'block' : 'none'
          $$(
            '#luckysheet-del-selected'
          ).style.display = cellRightClickConfig.deleteRow ? 'block' : 'none'
          $$(
            '#luckysheet-hide-selected'
          ).style.display = cellRightClickConfig.hideRow ? 'block' : 'none'
          $$(
            '#luckysheet-show-selected'
          ).style.display = cellRightClickConfig.hideRow ? 'block' : 'none'
          $$(
            '#luckysheet-column-row-width-selected'
          ).style.display = cellRightClickConfig.rowHeight ? 'block' : 'none'

          // 1. 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏
          if (
            !cellRightClickConfig.copy &&
            !cellRightClickConfig.copyAs &&
            !cellRightClickConfig.paste
          ) {
            $$(
              '#luckysheet-cols-rows-add .luckysheet-menuseparator'
            ).style.display = 'none'

            if (
              !cellRightClickConfig.insertRow &&
              !cellRightClickConfig.deleteRow &&
              !cellRightClickConfig.hideRow &&
              !cellRightClickConfig.rowHeight
            ) {
              $$(
                '#luckysheet-cols-rows-data .luckysheet-menuseparator'
              ).style.display = 'none'
            }
          }

          // 2. 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉
          if (
            !cellRightClickConfig.insertRow &&
            !cellRightClickConfig.deleteRow &&
            !cellRightClickConfig.hideRow &&
            !cellRightClickConfig.rowHeight
          ) {
            $$(
              '#luckysheet-cols-rows-add .luckysheet-menuseparator'
            ).style.display = 'none'
          }

          //行高默认值
          let cfg = $.extend(true, {}, Store.config)
          if (cfg['rowlen'] == null) {
            cfg['rowlen'] = {}
          }

          let first_rowlen =
            cfg['rowlen'][Store.luckysheet_select_save[0].row[0]] == null
              ? Store.defaultrowlen
              : cfg['rowlen'][Store.luckysheet_select_save[0].row[0]]
          let isSame = true

          for (let i = 0; i < Store.luckysheet_select_save.length; i++) {
            let s = Store.luckysheet_select_save[i]
            let r1 = s.row[0],
              r2 = s.row[1]

            for (let r = r1; r <= r2; r++) {
              let rowlen =
                cfg['rowlen'][r] == null
                  ? Store.defaultrowlen
                  : cfg['rowlen'][r]

              if (rowlen != first_rowlen) {
                isSame = false
                break
              }
            }
          }

          if (isSame) {
            $('#luckysheet-cols-rows-add')
              .find("input[type='number'].rcsize")
              .val(first_rowlen)
          } else {
            $('#luckysheet-cols-rows-add')
              .find("input[type='number'].rcsize")
              .val('')
          }
        } else {
          // 如果全部按钮都隐藏，则整个菜单容器也要隐藏
          if (
            !cellRightClickConfig.copy &&
            !cellRightClickConfig.copyAs &&
            !cellRightClickConfig.paste &&
            !cellRightClickConfig.insertRow &&
            !cellRightClickConfig.insertColumn &&
            !cellRightClickConfig.deleteRow &&
            !cellRightClickConfig.deleteColumn &&
            !cellRightClickConfig.deleteCell &&
            !cellRightClickConfig.clear &&
            !cellRightClickConfig.matrix &&
            !cellRightClickConfig.sort &&
            !cellRightClickConfig.filter &&
            !cellRightClickConfig.chart &&
            !cellRightClickConfig.image &&
            !cellRightClickConfig.link &&
            !cellRightClickConfig.data &&
            !cellRightClickConfig.cellFormat
          ) {
            return
          }

          // 当一个功能菜单块上方的功能块按钮都隐藏的时候，下方的功能块的顶部分割线也需要隐藏
          if (
            !cellRightClickConfig.copy &&
            !cellRightClickConfig.copyAs &&
            !cellRightClickConfig.paste
          ) {
            $$(
              '#luckysheet-cols-rows-handleincell .luckysheet-menuseparator'
            ).style.display = 'none'

            if (
              !cellRightClickConfig.insertRow &&
              !cellRightClickConfig.insertColumn &&
              !cellRightClickConfig.deleteRow &&
              !cellRightClickConfig.deleteColumn &&
              !cellRightClickConfig.deleteCell
            ) {
              $$(
                '#luckysheet-cols-rows-data .luckysheet-menuseparator'
              ).style.display = 'none'
            }
          }

          if (
            !cellRightClickConfig.insertRow &&
            !cellRightClickConfig.insertColumn &&
            !cellRightClickConfig.deleteRow &&
            !cellRightClickConfig.deleteColumn &&
            !cellRightClickConfig.deleteCell
          ) {
            $$(
              '#luckysheet-cols-rows-handleincell .luckysheet-menuseparator'
            ).style.display = 'none'
          }
        }

        // 当一个功能菜单块内所有的按钮都隐藏的时候，它顶部的分割线也需要隐藏掉
        if (
          !cellRightClickConfig.clear &&
          !cellRightClickConfig.matrix &&
          !cellRightClickConfig.sort &&
          !cellRightClickConfig.filter &&
          !cellRightClickConfig.chart &&
          !cellRightClickConfig.image &&
          !cellRightClickConfig.link &&
          !cellRightClickConfig.data &&
          !cellRightClickConfig.cellFormat
        ) {
          $$(
            '#luckysheet-cols-rows-data .luckysheet-menuseparator'
          ).style.display = 'none'
        }
        showrightclickmenu($('#luckysheet-rightclick-menu'), x, y)
      }

      // 备注：在mousedown中发送光标信息会漏处理部分(选区)范围
      server.saveParam(
        'mv',
        Store.currentSheetIndex,
        Store.luckysheet_select_save
      )
    })
    .dblclick(function (event) {
      // 双击事件获取节点
      if ($(event.target).hasClass('luckysheet-mousedown-cancel')) {
        return
      }

      //禁止前台编辑(只可 框选单元格、滚动查看表格)
      if (!Store.allowEdit) {
        return
      }

      if (parseInt($('#luckysheet-input-box').css('top')) > 0) {
        return
      }

      let mouse = mouseposition(event.pageX, event.pageY)
      if (
        mouse[0] >= Store.cellmainWidth - Store.cellMainSrollBarSize ||
        mouse[1] >= Store.cellmainHeight - Store.cellMainSrollBarSize
      ) {
        return
      }

      let scrollLeft = $('#luckysheet-cell-main').scrollLeft(),
        scrollTop = $('#luckysheet-cell-main').scrollTop()
      let x = mouse[0] + scrollLeft
      let y = mouse[1] + scrollTop

      if (
        luckysheetFreezen.freezenverticaldata != null &&
        mouse[0] <
        luckysheetFreezen.freezenverticaldata[0] -
        luckysheetFreezen.freezenverticaldata[2]
      ) {
        x = mouse[0] + luckysheetFreezen.freezenverticaldata[2]
      }

      if (
        luckysheetFreezen.freezenhorizontaldata != null &&
        mouse[1] <
        luckysheetFreezen.freezenhorizontaldata[0] -
        luckysheetFreezen.freezenhorizontaldata[2]
      ) {
        y = mouse[1] + luckysheetFreezen.freezenhorizontaldata[2]
      }

      let row_location = rowLocation(y),
        row_index = row_location[2]

      let col_location = colLocation(x),
        col_index = col_location[2]
      let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index)
      if (!!margeset) {
        row_index = margeset.row[2]
        col_index = margeset.column[2]
      }
      // 判断当前节点是否支持双击
      // if (Store.flowdata[row_index][col_index]?.titleReadonly) return
      if (pivotTable.isPivotRange(row_index, col_index)) {
        //数据透视表没有 任何数据
        if (
          (pivotTable.filter == null || pivotTable.filter.length == 0) &&
          (pivotTable.row == null || pivotTable.row.length == 0) &&
          (pivotTable.column == null || pivotTable.column.length == 0) &&
          (pivotTable.values == null || pivotTable.values.length == 0)
        ) {
          return
        }

        //数据透视表没有 数值数据
        if (pivotTable.values == null || pivotTable.values.length == 0) {
          return
        }

        //点击位置不是 数值数据 所在区域
        if (row_index == 0 || col_index == 0) {
          return
        }

        if (pivotTable.column != null && pivotTable.column.length > 0) {
          if (
            pivotTable.values.length >= 2 &&
            pivotTable.showType == 'column'
          ) {
            if (
              row_index <= pivotTable.column.length ||
              col_index >=
              pivotTable.pivotDatas[0].length - pivotTable.values.length
            ) {
              return
            }
          } else {
            if (
              row_index <= pivotTable.column.length - 1 ||
              col_index >= pivotTable.pivotDatas[0].length - 1
            ) {
              return
            }
          }
        }

        if (pivotTable.row != null && pivotTable.row.length > 0) {
          if (pivotTable.values.length >= 2 && pivotTable.showType == 'row') {
            if (
              col_index <= pivotTable.row.length ||
              row_index >=
              pivotTable.pivotDatas.length - pivotTable.values.length
            ) {
              return
            }
          } else {
            if (
              col_index <= pivotTable.row.length - 1 ||
              row_index >= pivotTable.pivotDatas.length - 1
            ) {
              return
            }
          }
        }

        sheetmanage.addNewSheet(event)

        pivotTable.drillDown(row_index, col_index)
        return
      }

      if (
        $('#luckysheet-search-formula-parm').is(':visible') ||
        $('#luckysheet-search-formula-parm-select').is(':visible')
      ) {
        //公式参数栏显示
        $('#luckysheet-cell-selected').hide()
      } else if (
        $('#luckysheet-conditionformat-dialog').is(':visible') ||
        $('#luckysheet-administerRule-dialog').is(':visible') ||
        $('#luckysheet-newConditionRule-dialog').is(':visible') ||
        $('#luckysheet-editorConditionRule-dialog').is(':visible') ||
        $('#luckysheet-singleRange-dialog').is(':visible') ||
        $('#luckysheet-multiRange-dialog').is(':visible')
      ) {
        //条件格式
        return
      } else if (
        $('#luckysheet-modal-dialog-slider-alternateformat').is(':visible') ||
        $('#luckysheet-alternateformat-rangeDialog').is(':visible')
      ) {
        //交替颜色
        return
      } else {
        if (menuButton.luckysheetPaintModelOn) {
          menuButton.cancelPaintModel()
        }

        // 检查当前坐标和焦点坐标是否一致，如果不一致那么进行修正
        let column_focus = Store.luckysheet_select_save[0]['column_focus']
        let row_focus = Store.luckysheet_select_save[0]['row_focus']
        if (column_focus !== col_index || row_focus !== row_index) {
          row_index = row_focus
          col_index = column_focus
        }
        luckysheetupdateCell(row_index, col_index, Store.flowdata)

        /* 设置选区高亮 */
        selectHightlightShow()
      }
    })

  //监听拖拽
  document.getElementById('luckysheet-cell-main').addEventListener(
    'drop',
    function (e) {
      e.preventDefault()
      e.stopPropagation()

      let files = e.dataTransfer.files

      //拖拽插入图片
      if (files.length == 1 && files[0].type.indexOf('image') > -1) {
        if (
          !checkProtectionAuthorityNormal(
            Store.currentSheetIndex,
            'editObjects'
          )
        ) {
          return
        }
        imageCtrl.insertImg(files[0])
      }
      handleCellDragStopEvent(e)
    },
    false
  )
  document.getElementById('luckysheet-cell-main').addEventListener(
    'dragover',
    function (e) {
      e.preventDefault()
      e.stopPropagation()
    },
    false
  )

  /**
   * 处理单元格上鼠标拖拽停止事件
   * @param {DragEvent} event
   */
  function handleCellDragStopEvent(event) {
    if (
      luckysheetConfigsetting &&
      luckysheetConfigsetting.hook &&
      luckysheetConfigsetting.hook.cellDragStop
    ) {
      let mouse = mouseposition(event.pageX, event.pageY)
      let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
      let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

      let row_location = rowLocation(y),
        row = row_location[1],
        row_pre = row_location[0],
        row_index = row_location[2]
      let col_location = colLocation(x),
        col = col_location[1],
        col_pre = col_location[0],
        col_index = col_location[2]

      let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index)
      if (!!margeset) {
        row = margeset.row[1]
        row_pre = margeset.row[0]
        row_index = margeset.row[2]

        col = margeset.column[1]
        col_pre = margeset.column[0]
        col_index = margeset.column[2]
      }

      let sheetFile = sheetmanage.getSheetByIndex()

      let luckysheetTableContent = $('#luckysheetTableContent')
        .get(0)
        .getContext('2d')
      method.createHookFunction(
        'cellDragStop',
        Store.flowdata[row_index][col_index],
        {
          r: row_index,
          c: col_index,
          start_r: row_pre,
          start_c: col_pre,
          end_r: row,
          end_c: col,
        },
        sheetFile,
        luckysheetTableContent,
        event
      )
    }
  }

  //表格mousemove
  $(document).on('mousemove.luckysheetEvent', function (event) {
    luckysheetPostil.overshow(event) //有批注显示
    hyperlinkCtrl.overshow(event) //链接提示显示

    window.cancelAnimationFrame(Store.jfautoscrollTimeout)

    if (
      luckysheetConfigsetting &&
      luckysheetConfigsetting.hook &&
      luckysheetConfigsetting.hook.sheetMousemove
    ) {
      let mouse = mouseposition(event.pageX, event.pageY)
      let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
      let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

      let row_location = rowLocation(y),
        row = row_location[1],
        row_pre = row_location[0],
        row_index = row_location[2]
      let col_location = colLocation(x),
        col = col_location[1],
        col_pre = col_location[0],
        col_index = col_location[2]

      let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index)
      if (!!margeset) {
        row = margeset.row[1]
        row_pre = margeset.row[0]
        row_index = margeset.row[2]

        col = margeset.column[1]
        col_pre = margeset.column[0]
        col_index = margeset.column[2]
      }

      // if(Store.flowdata[row_index] && Store.flowdata[row_index][col_index]){
      let sheetFile = sheetmanage.getSheetByIndex()

      let moveState = {
        functionResizeStatus: formula.functionResizeStatus,
        horizontalmoveState: !!luckysheetFreezen.horizontalmovestate,
        verticalmoveState: !!luckysheetFreezen.verticalmovestate,
        pivotTableMoveState: !!pivotTable && pivotTable.movestate,
        sheetMoveStatus: Store.luckysheet_sheet_move_status,
        scrollStatus: !!Store.luckysheet_scroll_status,
        selectStatus: !!Store.luckysheet_select_status,
        rowsSelectedStatus: !!Store.luckysheet_rows_selected_status,
        colsSelectedStatus: !!Store.luckysheet_cols_selected_status,
        cellSelectedMove: !!Store.luckysheet_cell_selected_move,
        cellSelectedExtend: !!Store.luckysheet_cell_selected_extend,
        colsChangeSize: !!Store.luckysheet_cols_change_size,
        rowsChangeSize: !!Store.luckysheet_rows_change_size,
        chartMove: !!Store.chartparam.luckysheetCurrentChartMove,
        chartResize: !!Store.chartparam.luckysheetCurrentChartResize,
        rangeResize: !!formula.rangeResize,
        rangeMove: !!formula.rangeMove,
      }

      let luckysheetTableContent = $('#luckysheetTableContent')
        .get(0)
        .getContext('2d')

      if (Store.flowdata && Store.flowdata[row_index]) {
        method.createHookFunction(
          'sheetMousemove',
          Store.flowdata[row_index][col_index],
          {
            r: row_index,
            c: col_index,
            start_r: row_pre,
            start_c: col_pre,
            end_r: row,
            end_c: col,
          },
          sheetFile,
          moveState,
          luckysheetTableContent
        )
      }
    }

    if (formula.functionResizeStatus) {
      let y = event.pageY
      let movepx = y - formula.functionResizeData.y
      let mpx = formula.functionResizeData.calculatebarHeight + movepx
      let winh = Math.round($(window).height() / 2)

      if (mpx <= 28) {
        if (mpx <= 20) {
          return
        }
        mpx = 28
      } else if (mpx >= winh) {
        if (mpx >= winh + 8) {
          return
        }
        mpx = winh
      }
      Store.calculatebarHeight = mpx
      $('#luckysheet-wa-calculate').css('height', Store.calculatebarHeight - 2)
      $('#luckysheet-wa-calculate-size').css({
        background: '#5e5e5e',
        cursor: 'ns-resize',
      })

      clearTimeout(formula.functionResizeTimeout)
      formula.functionResizeTimeout = setTimeout(function () {
        luckysheetsizeauto()
      }, 15)
    } else if (!!luckysheetFreezen.horizontalmovestate) {
      let mouse = mouseposition(event.pageX, event.pageY)
      let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
      let scrollTop = $('#luckysheet-cell-main').scrollTop()
      let x = mouse[0] + scrollLeft
      let y = mouse[1] + scrollTop

      let row_location = rowLocation(y),
        row = row_location[1],
        row_pre = row_location[0],
        row_index = row_location[2]
      let top = mouse[1] + Store.columnHeaderHeight

      if (top < Store.columnHeaderHeight) {
        top = Store.columnHeaderHeight
      }

      if (top > luckysheetFreezen.windowHeight - 4) {
        top = luckysheetFreezen.windowHeight - 4
      }

      $('#luckysheet-freezebar-horizontal')
        .find('.luckysheet-freezebar-horizontal-handle')
        .css({ top: top })

      if (
        top + scrollTop - Store.columnHeaderHeight >=
        row_pre + (row - row_pre) / 2
      ) {
        top = row - 2 - scrollTop + Store.columnHeaderHeight
        luckysheetFreezen.freezenhorizontaldata = [
          row,
          row_index + 1,
          scrollTop,
          luckysheetFreezen.cutVolumn(Store.visibledatarow, row_index + 1),
          top,
        ]
      } else {
        top = row_pre - 2 - scrollTop + Store.columnHeaderHeight
        luckysheetFreezen.freezenhorizontaldata = [
          row_pre,
          row_index,
          scrollTop,
          luckysheetFreezen.cutVolumn(Store.visibledatarow, row_index),
          top,
        ]
      }

      $('#luckysheet-freezebar-horizontal')
        .find('.luckysheet-freezebar-horizontal-drop')
        .css({ top: top })
      luckysheetFreezen.saveFreezen(
        luckysheetFreezen.freezenhorizontaldata,
        top,
        null,
        null
      )
    } else if (!!luckysheetFreezen.verticalmovestate) {
      let mouse = mouseposition(event.pageX, event.pageY)
      let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
      let scrollTop = $('#luckysheet-cell-main').scrollTop()
      let x = mouse[0] + scrollLeft
      let y = mouse[1] + scrollTop

      let col_location = colLocation(x),
        col = col_location[1],
        col_pre = col_location[0],
        col_index = col_location[2]

      let left = mouse[0] + Store.rowHeaderWidth

      if (left < Store.rowHeaderWidth) {
        left = Store.rowHeaderWidth
      }

      if (left > luckysheetFreezen.windowWidth - 4) {
        left = luckysheetFreezen.windowWidth - 4
      }

      $('#luckysheet-freezebar-vertical')
        .find('.luckysheet-freezebar-vertical-handle')
        .css({ left: left })

      if (
        left + scrollLeft - Store.rowHeaderWidth >=
        col_pre + (col - col_pre) / 2
      ) {
        left = col - 2 - scrollLeft + Store.rowHeaderWidth
        luckysheetFreezen.freezenverticaldata = [
          col,
          col_index + 1,
          scrollLeft,
          luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_index + 1),
          left,
        ]
      } else {
        left = col_pre - 2 - scrollLeft + Store.rowHeaderWidth
        luckysheetFreezen.freezenverticaldata = [
          col_pre,
          col_index,
          scrollLeft,
          luckysheetFreezen.cutVolumn(Store.visibledatacolumn, col_index),
          left,
        ]
      }

      $('#luckysheet-freezebar-vertical')
        .find('.luckysheet-freezebar-vertical-drop')
        .css({ left: left })
      luckysheetFreezen.saveFreezen(
        null,
        null,
        luckysheetFreezen.freezenverticaldata,
        left
      )
      luckysheetsizeauto() //调节选区时下部单元格溢出
    } else if (!!pivotTable && pivotTable.movestate) {
      let x = event.pageX,
        y = event.pageY
      $('#luckysheet-modal-dialog-slider-pivot-move').css({
        left: x - pivotTable.movesave.width / 2,
        top: y - pivotTable.movesave.height,
      })
    } else if (Store.luckysheet_sheet_move_status) {
      let scrollLeft = $('#luckysheet-sheet-container-c').scrollLeft()
      let x = event.pageX + scrollLeft

      if (Math.abs(event.pageX - Store.luckysheet_sheet_move_data.pageX) < 3) {
        return
      }

      let winW = $('#luckysheet-sheet-container').width()
      let left =
        x -
        Store.luckysheet_sheet_move_data.curleft -
        $('#luckysheet-sheet-container').offset().left
      Store.luckysheet_sheet_move_data.activeobject.css({ left: left })

      let row_index = luckysheet_searcharray(
        Store.luckysheet_sheet_move_data.widthlist,
        left + Store.luckysheet_sheet_move_data.curleft
      )
      Store.luckysheet_sheet_move_data.cursorobject.css({ cursor: 'move' })

      if (left - scrollLeft <= 6) {
        $('#luckysheet-sheets-leftscroll').click()
      }

      if (left - scrollLeft >= winW - 40) {
        $('#luckysheet-sheets-rightscroll').click()
      }

      if (row_index != Store.luckysheet_sheet_move_data.curindex) {
        if (row_index == -1 && left > 0) {
          row_index = Store.luckysheet_sheet_move_data.widthlist.length - 1
          $('#luckysheet-sheets-item-clone').insertAfter(
            $('#luckysheet-sheet-area div.luckysheet-sheets-item:visible').eq(
              row_index
            )
          )
        } else if (row_index == -1 && left <= 0) {
          $('#luckysheet-sheets-item-clone').insertBefore(
            $('#luckysheet-sheet-area div.luckysheet-sheets-item:visible').eq(0)
          )
        } else {
          $('#luckysheet-sheets-item-clone').insertAfter(
            $('#luckysheet-sheet-area div.luckysheet-sheets-item:visible').eq(
              row_index
            )
          )
        }

        Store.luckysheet_sheet_move_data.widthlist = []
        $('#luckysheet-sheet-area div.luckysheet-sheets-item:visible').each(
          function (i) {
            if (i == 0) {
              Store.luckysheet_sheet_move_data.widthlist.push(
                parseInt($(this).outerWidth())
              )
            } else {
              Store.luckysheet_sheet_move_data.widthlist.push(
                parseInt($(this).outerWidth()) +
                Store.luckysheet_sheet_move_data.widthlist[i - 1]
              )
            }
          }
        )

        Store.luckysheet_sheet_move_data.curindex = $(
          '#luckysheet-sheet-area div.luckysheet-sheets-item:visible'
        ).index($('#luckysheet-sheets-item-clone'))
      }
    } else if (Store.luckysheet_model_move_state) {
      let scrollTop = $(document).scrollTop(),
        scrollLeft = $(document).scrollLeft()
      let y = event.pageY + scrollTop,
        x = event.pageX + scrollLeft
      let winH = $(window).height(),
        winW = $(window).width()
      let myh = Store.luckysheet_model_move_obj.height(),
        myw = Store.luckysheet_model_move_obj.width()
      let top = y - Store.luckysheet_model_xy[1],
        left = x - Store.luckysheet_model_xy[0]

      if (top < 0) {
        top = 0
      }

      if (top + myh + 62 > winH) {
        top = winH - myh - 62
      }

      if (left < 0) {
        left = 0
      }

      if (left + myw + 86 > winW) {
        left = winW - myw - 86
      }

      Store.luckysheet_model_move_obj.css({ top: top, left: left })
      event.preventDefault()
    } else if (
      !!Store.luckysheet_scroll_status ||
      !!Store.luckysheet_select_status ||
      !!Store.luckysheet_rows_selected_status ||
      !!Store.luckysheet_cols_selected_status ||
      !!Store.luckysheet_cell_selected_move ||
      !!Store.luckysheet_cell_selected_extend ||
      !!Store.luckysheet_cols_change_size ||
      !!Store.luckysheet_rows_change_size ||
      !!Store.chartparam.luckysheetCurrentChartMove ||
      !!Store.chartparam.luckysheetCurrentChartResize ||
      !!formula.rangeResize ||
      !!formula.rangeMove
    ) {
      if (Store.luckysheet_select_status) {
        clearTimeout(Store.countfuncTimeout)
        Store.countfuncTimeout = setTimeout(function () {
          countfunc()
        }, 500)
      }

      function mouseRender() {
        if (
          Store.luckysheet_scroll_status &&
          !Store.luckysheet_cols_change_size &&
          !Store.luckysheet_rows_change_size
        ) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let left = $('#luckysheet-scrollbar-x').scrollLeft(),
            top = $('#luckysheet-scrollbar-y').scrollTop()
          let x = mouse[0]
          let y = mouse[1]
          let winH = $('#luckysheet-cell-main').height() - 20 * Store.zoomRatio,
            winW = $('#luckysheet-cell-main').width() - 60 * Store.zoomRatio

          if (y < 0 || y > winH) {
            let stop
            if (y < 0) {
              stop = top + y / 2
            } else {
              stop = top + (y - winH) / 2
            }
            $('#luckysheet-scrollbar-y').scrollTop(stop)
          }

          if (x < 0 || x > winW) {
            let sleft
            if (x < 0) {
              sleft = left + x / 2
            } else {
              sleft = left + (x - winW) / 2
            }

            $('#luckysheet-scrollbar-x').scrollLeft(sleft)
          }
        }
        if (Store.luckysheet_select_status) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          let row_location = rowLocation(y),
            row = row_location[1],
            row_pre = row_location[0],
            row_index = row_location[2]
          let col_location = colLocation(x),
            col = col_location[1],
            col_pre = col_location[0],
            col_index = col_location[2]

          if (
            !checkProtectionSelectLockedOrUnLockedCells(
              row_index,
              col_index,
              Store.currentSheetIndex
            )
          ) {
            // Store.luckysheet_select_status = false;
            return
          }

          let last = $.extend(
            true,
            {},
            Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
            ]
          )

          let top = 0,
            height = 0,
            rowseleted = []
          if (last.top > row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre

            if (last.row[1] > last.row_focus) {
              last.row[1] = last.row_focus
            }

            rowseleted = [row_index, last.row[1]]
          } else if (last.top == row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre
            rowseleted = [row_index, last.row[0]]
          } else {
            top = last.top
            height = row - last.top - 1

            if (last.row[0] < last.row_focus) {
              last.row[0] = last.row_focus
            }

            rowseleted = [last.row[0], row_index]
          }

          let left = 0,
            width = 0,
            columnseleted = []
          if (last.left > col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre

            if (last.column[1] > last.column_focus) {
              last.column[1] = last.column_focus
            }

            columnseleted = [col_index, last.column[1]]
          } else if (last.left == col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre
            columnseleted = [col_index, last.column[0]]
          } else {
            left = last.left
            width = col - last.left - 1

            if (last.column[0] < last.column_focus) {
              last.column[0] = last.column_focus
            }

            columnseleted = [last.column[0], col_index]
          }

          let changeparam = menuButton.mergeMoveMain(
            columnseleted,
            rowseleted,
            last,
            top,
            height,
            left,
            width
          )
          if (changeparam != null) {
            columnseleted = changeparam[0]
            rowseleted = changeparam[1]
            top = changeparam[2]
            height = changeparam[3]
            left = changeparam[4]
            width = changeparam[5]
          }

          last['row'] = rowseleted
          last['column'] = columnseleted

          last['left_move'] = left
          last['width_move'] = width
          last['top_move'] = top
          last['height_move'] = height

          Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
          ] = last

          selectHightlightShow()
          luckysheetFreezen.scrollFreezen()

          // selectHelpboxFill();

          //交替颜色选择范围
          if ($('#luckysheet-alternateformat-rangeDialog').is(':visible')) {
            $('#luckysheet-alternateformat-rangeDialog input').val(
              getRangetxt(
                Store.currentSheetIndex,
                Store.luckysheet_select_save[
                Store.luckysheet_select_save.length - 1
                ]
              )
            )
          }

          if (pivotTable.luckysheet_pivotTable_select_state) {
            $('#luckysheet-pivotTable-range-selection-input').val(
              Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
                .name +
              '!' +
              chatatABC(Store.luckysheet_select_save[0]['column'][0]) +
              (Store.luckysheet_select_save[0]['row'][0] + 1) +
              ':' +
              chatatABC(Store.luckysheet_select_save[0]['column'][1]) +
              (Store.luckysheet_select_save[0]['row'][1] + 1)
            )
          }
        } else if (conditionformat.selectStatus) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          let row_location = rowLocation(y),
            row = row_location[1],
            row_pre = row_location[0],
            row_index = row_location[2]
          let col_location = colLocation(x),
            col = col_location[1],
            col_pre = col_location[0],
            col_index = col_location[2]

          let last =
            conditionformat.selectRange[conditionformat.selectRange.length - 1]

          let top = 0,
            height = 0,
            rowseleted = []
          if (last.top > row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre

            if (last.row[1] > last.row_focus) {
              last.row[1] = last.row_focus
            }

            rowseleted = [row_index, last.row[1]]
          } else if (last.top == row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre
            rowseleted = [row_index, last.row[0]]
          } else {
            top = last.top
            height = row - last.top - 1

            if (last.row[0] < last.row_focus) {
              last.row[0] = last.row_focus
            }

            rowseleted = [last.row[0], row_index]
          }

          let left = 0,
            width = 0,
            columnseleted = []
          if (last.left > col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre

            if (last.column[1] > last.column_focus) {
              last.column[1] = last.column_focus
            }

            columnseleted = [col_index, last.column[1]]
          } else if (last.left == col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre
            columnseleted = [col_index, last.column[0]]
          } else {
            left = last.left
            width = col - last.left - 1

            if (last.column[0] < last.column_focus) {
              last.column[0] = last.column_focus
            }

            columnseleted = [last.column[0], col_index]
          }

          let changeparam = menuButton.mergeMoveMain(
            columnseleted,
            rowseleted,
            last,
            top,
            height,
            left,
            width
          )
          if (changeparam != null) {
            columnseleted = changeparam[0]
            rowseleted = changeparam[1]
            top = changeparam[2]
            height = changeparam[3]
            left = changeparam[4]
            width = changeparam[5]
          }

          last['row'] = rowseleted
          last['column'] = columnseleted

          last['left_move'] = left
          last['width_move'] = width
          last['top_move'] = top
          last['height_move'] = height

          conditionformat.selectRange[
            conditionformat.selectRange.length - 1
          ] = last

          selectionCopyShow(conditionformat.selectRange)

          let range = conditionformat.getTxtByRange(conditionformat.selectRange)
          $('#luckysheet-multiRange-dialog input').val(range)
        } else if (dataVerificationCtrl.selectStatus) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          let row_location = rowLocation(y),
            row = row_location[1],
            row_pre = row_location[0],
            row_index = row_location[2]
          let col_location = colLocation(x),
            col = col_location[1],
            col_pre = col_location[0],
            col_index = col_location[2]

          let last =
            dataVerificationCtrl.selectRange[
            dataVerificationCtrl.selectRange.length - 1
            ]

          let top = 0,
            height = 0,
            rowseleted = []
          if (last.top > row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre

            if (last.row[1] > last.row_focus) {
              last.row[1] = last.row_focus
            }

            rowseleted = [row_index, last.row[1]]
          } else if (last.top == row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre
            rowseleted = [row_index, last.row[0]]
          } else {
            top = last.top
            height = row - last.top - 1

            if (last.row[0] < last.row_focus) {
              last.row[0] = last.row_focus
            }

            rowseleted = [last.row[0], row_index]
          }

          let left = 0,
            width = 0,
            columnseleted = []
          if (last.left > col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre

            if (last.column[1] > last.column_focus) {
              last.column[1] = last.column_focus
            }

            columnseleted = [col_index, last.column[1]]
          } else if (last.left == col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre
            columnseleted = [col_index, last.column[0]]
          } else {
            left = last.left
            width = col - last.left - 1

            if (last.column[0] < last.column_focus) {
              last.column[0] = last.column_focus
            }

            columnseleted = [last.column[0], col_index]
          }

          let changeparam = menuButton.mergeMoveMain(
            columnseleted,
            rowseleted,
            last,
            top,
            height,
            left,
            width
          )
          if (changeparam != null) {
            columnseleted = changeparam[0]
            rowseleted = changeparam[1]
            top = changeparam[2]
            height = changeparam[3]
            left = changeparam[4]
            width = changeparam[5]
          }

          last['row'] = rowseleted
          last['column'] = columnseleted

          last['left_move'] = left
          last['width_move'] = width
          last['top_move'] = top
          last['height_move'] = height

          dataVerificationCtrl.selectRange[
            dataVerificationCtrl.selectRange.length - 1
          ] = last

          selectionCopyShow(dataVerificationCtrl.selectRange)

          let range = dataVerificationCtrl.getTxtByRange(
            dataVerificationCtrl.selectRange
          )
          if (formula.rangetosheet != Store.currentSheetIndex) {
            range =
              Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
                .name +
              '!' +
              range
          }
          $('#luckysheet-dataVerificationRange-dialog input').val(range)
        } else if (formula.rangestart) {
          formula.rangedrag(event)
        } else if (formula.rangedrag_row_start) {
          formula.rangedrag_row(event)
        } else if (formula.rangedrag_column_start) {
          formula.rangedrag_column(event)
        } else if (Store.luckysheet_rows_selected_status) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let y = mouse[1] + $('#luckysheet-rows-h').scrollTop()
          if (y < 0) {
            return false
          }

          let row_location = rowLocation(y),
            row = row_location[1],
            row_pre = row_location[0],
            row_index = row_location[2]
          let col_index = Store.visibledatacolumn.length - 1,
            col = Store.visibledatacolumn[col_index],
            col_pre = 0

          let last = $.extend(
            true,
            {},
            Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
            ]
          )

          let top = 0,
            height = 0,
            rowseleted = []
          if (last.top > row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre

            if (last.row[1] > last.row_focus) {
              last.row[1] = last.row_focus
            }

            rowseleted = [row_index, last.row[1]]
          } else if (last.top == row_pre) {
            top = row_pre
            height = last.top + last.height - row_pre
            rowseleted = [row_index, last.row[0]]
          } else {
            top = last.top
            height = row - last.top - 1

            if (last.row[0] < last.row_focus) {
              last.row[0] = last.row_focus
            }

            rowseleted = [last.row[0], row_index]
          }

          last['row'] = rowseleted

          last['top_move'] = top
          last['height_move'] = height

          Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
          ] = last

          selectHightlightShow()
          clearTimeout(Store.countfuncTimeout)
          Store.countfuncTimeout = setTimeout(function () {
            countfunc()
          }, 500)
        } else if (Store.luckysheet_cols_selected_status) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let x = mouse[0] + $('#luckysheet-cols-h-c').scrollLeft()
          if (x < 0) {
            return false
          }

          let row_index = Store.visibledatarow.length - 1,
            row = Store.visibledatarow[row_index],
            row_pre = 0
          let col_location = colLocation(x),
            col = col_location[1],
            col_pre = col_location[0],
            col_index = col_location[2]

          let last = $.extend(
            true,
            {},
            Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
            ]
          )

          let left = 0,
            width = 0,
            columnseleted = []
          if (last.left > col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre

            if (last.column[1] > last.column_focus) {
              last.column[1] = last.column_focus
            }

            columnseleted = [col_index, last.column[1]]
          } else if (last.left == col_pre) {
            left = col_pre
            width = last.left + last.width - col_pre
            columnseleted = [col_index, last.column[0]]
          } else {
            left = last.left
            width = col - last.left - 1

            if (last.column[0] < last.column_focus) {
              last.column[0] = last.column_focus
            }

            columnseleted = [last.column[0], col_index]
          }

          last['column'] = columnseleted

          last['left_move'] = left
          last['width_move'] = width

          Store.luckysheet_select_save[
            Store.luckysheet_select_save.length - 1
          ] = last

          selectHightlightShow()
          clearTimeout(Store.countfuncTimeout)
          Store.countfuncTimeout = setTimeout(function () {
            countfunc()
          }, 500)
        } else if (Store.luckysheet_cell_selected_move) {
          let mouse = mouseposition(event.pageX, event.pageY)

          let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
          let scrollTop = $('#luckysheet-cell-main').scrollTop()

          let x = mouse[0] + scrollLeft
          let y = mouse[1] + scrollTop

          let winH =
            $(window).height() +
            scrollTop -
            Store.sheetBarHeight -
            Store.statisticBarHeight,
            winW = $(window).width() + scrollLeft

          let row_location = rowLocation(y),
            row = row_location[1],
            row_pre = row_location[0],
            row_index = row_location[2]
          let col_location = colLocation(x),
            col = col_location[1],
            col_pre = col_location[0],
            col_index = col_location[2]

          let row_index_original = Store.luckysheet_cell_selected_move_index[0],
            col_index_original = Store.luckysheet_cell_selected_move_index[1]

          let row_s =
            Store.luckysheet_select_save[0]['row'][0] -
            row_index_original +
            row_index,
            row_e =
              Store.luckysheet_select_save[0]['row'][1] -
              row_index_original +
              row_index

          let col_s =
            Store.luckysheet_select_save[0]['column'][0] -
            col_index_original +
            col_index,
            col_e =
              Store.luckysheet_select_save[0]['column'][1] -
              col_index_original +
              col_index

          if (row_s < 0 || y < 0) {
            row_s = 0
            row_e =
              Store.luckysheet_select_save[0]['row'][1] -
              Store.luckysheet_select_save[0]['row'][0]
          }

          if (col_s < 0 || x < 0) {
            col_s = 0
            col_e =
              Store.luckysheet_select_save[0]['column'][1] -
              Store.luckysheet_select_save[0]['column'][0]
          }

          if (
            row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] ||
            y > winH
          ) {
            row_s =
              Store.visibledatarow.length -
              1 -
              Store.luckysheet_select_save[0]['row'][1] +
              Store.luckysheet_select_save[0]['row'][0]
            row_e = Store.visibledatarow.length - 1
          }

          if (
            col_e >=
            Store.visibledatacolumn[Store.visibledatacolumn.length - 1] ||
            x > winW
          ) {
            col_s =
              Store.visibledatacolumn.length -
              1 -
              Store.luckysheet_select_save[0]['column'][1] +
              Store.luckysheet_select_save[0]['column'][0]
            col_e = Store.visibledatacolumn.length - 1
          }

          col_pre = col_s - 1 == -1 ? 0 : Store.visibledatacolumn[col_s - 1]
          col = Store.visibledatacolumn[col_e]
          row_pre = row_s - 1 == -1 ? 0 : Store.visibledatarow[row_s - 1]
          row = Store.visibledatarow[row_e]

          $('#luckysheet-cell-selected-move').css({
            left: col_pre,
            width: col - col_pre - 2,
            top: row_pre,
            height: row - row_pre - 2,
            display: 'block',
          })
        } else if (Store.luckysheet_cell_selected_extend) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let scrollLeft = $('#luckysheet-cell-main').scrollLeft() - 5
          let scrollTop = $('#luckysheet-cell-main').scrollTop() - 5

          let x = mouse[0] + scrollLeft
          let y = mouse[1] + scrollTop

          let winH =
            $(window).height() +
            scrollTop -
            Store.sheetBarHeight -
            Store.statisticBarHeight,
            winW = $(window).width() + scrollLeft

          let row_location = rowLocation(y),
            row = row_location[1],
            row_pre = row_location[0],
            row_index = row_location[2]
          let col_location = colLocation(x),
            col = col_location[1],
            col_pre = col_location[0],
            col_index = col_location[2]

          let row_index_original =
            Store.luckysheet_cell_selected_extend_index[0],
            col_index_original = Store.luckysheet_cell_selected_extend_index[1]

          let row_s = Store.luckysheet_select_save[0]['row'][0],
            row_e = Store.luckysheet_select_save[0]['row'][1]
          let col_s = Store.luckysheet_select_save[0]['column'][0],
            col_e = Store.luckysheet_select_save[0]['column'][1]

          if (row_s < 0 || y < 0) {
            row_s = 0
            row_e =
              Store.luckysheet_select_save[0]['row'][1] -
              Store.luckysheet_select_save[0]['row'][0]
          }

          if (col_s < 0 || x < 0) {
            col_s = 0
            col_e =
              Store.luckysheet_select_save[0]['column'][1] -
              Store.luckysheet_select_save[0]['column'][0]
          }

          if (
            row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] ||
            y > winH
          ) {
            row_s =
              Store.visibledatarow.length -
              1 -
              Store.luckysheet_select_save[0]['row'][1] +
              Store.luckysheet_select_save[0]['row'][0]
            row_e = Store.visibledatarow.length - 1
          }

          if (
            col_e >=
            Store.visibledatacolumn[Store.visibledatacolumn.length - 1] ||
            x > winW
          ) {
            col_s =
              Store.visibledatacolumn.length -
              1 -
              Store.luckysheet_select_save[0]['column'][1] +
              Store.luckysheet_select_save[0]['column'][0]
            col_e = Store.visibledatacolumn.length - 1
          }

          let top = Store.luckysheet_select_save[0].top_move,
            height = Store.luckysheet_select_save[0].height_move
          let left = Store.luckysheet_select_save[0].left_move,
            width = Store.luckysheet_select_save[0].width_move

          if (
            Math.abs(row_index_original - row_index) >
            Math.abs(col_index_original - col_index)
          ) {
            if (!(row_index >= row_s && row_index <= row_e)) {
              if (Store.luckysheet_select_save[0].top_move >= row_pre) {
                top = row_pre
                height =
                  Store.luckysheet_select_save[0].top_move +
                  Store.luckysheet_select_save[0].height_move -
                  row_pre
              } else {
                top = Store.luckysheet_select_save[0].top_move
                height = row - Store.luckysheet_select_save[0].top_move - 1
              }
            }
          } else {
            if (!(col_index >= col_s && col_index <= col_e)) {
              if (Store.luckysheet_select_save[0].left_move >= col_pre) {
                left = col_pre
                width =
                  Store.luckysheet_select_save[0].left_move +
                  Store.luckysheet_select_save[0].width_move -
                  col_pre
              } else {
                left = Store.luckysheet_select_save[0].left_move
                width = col - Store.luckysheet_select_save[0].left_move - 1
              }
            }
          }

          $('#luckysheet-cell-selected-extend').css({
            left: left,
            width: width,
            top: top,
            height: height,
            display: 'block',
          })
        } else if (Store.luckysheet_cols_change_size) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let scrollLeft = $('#luckysheet-cols-h-c').scrollLeft()
          let x = mouse[0] + scrollLeft
          let winW = $(window).width()

          let row_index = Store.visibledatarow.length - 1,
            row = Store.visibledatarow[row_index],
            row_pre = 0
          let col_location = colLocation(x),
            col = col_location[1],
            col_pre = col_location[0],
            col_index = col_location[2]

          if (
            x + 3 - Store.luckysheet_cols_change_size_start[0] > 30 &&
            x < winW + scrollLeft - 100
          ) {
            $('#luckysheet-change-size-line').css({ left: x })
            $('#luckysheet-cols-change-size').css({ left: x - 2 })
          }
        } else if (Store.luckysheet_rows_change_size) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let scrollTop = $('#luckysheet-rows-h').scrollTop()
          let y = mouse[1] + scrollTop
          let winH = $(window).height()

          let row_location = rowLocation(y),
            row = row_location[1],
            row_pre = row_location[0],
            row_index = row_location[2]

          if (
            y + 3 - Store.luckysheet_rows_change_size_start[0] > 19 &&
            y < winH + scrollTop - 200
          ) {
            $('#luckysheet-change-size-line').css({ top: y })
            $('#luckysheet-rows-change-size').css({ top: y })
          }
        }
        // chart move
        else if (!!Store.chartparam.luckysheetCurrentChartMove) {
          const mouse = mouseposition(event.pageX, event.pageY)
          const x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          const y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          const myh = Store.chartparam.luckysheetCurrentChartMoveObj.height(),
            myw = Store.chartparam.luckysheetCurrentChartMoveObj.width()
          let top = y - Store.chartparam.luckysheetCurrentChartMoveXy[1],
            left = x - Store.chartparam.luckysheetCurrentChartMoveXy[0]

          if (top < 0) {
            top = 0
          }

          if (
            top + myh + 42 + 6 >
            Store.chartparam.luckysheetCurrentChartMoveWinH
          ) {
            top = Store.chartparam.luckysheetCurrentChartMoveWinH - myh - 42 - 6
          }

          if (left < 0) {
            left = 0
          }

          if (
            left + myw + 22 + 36 >
            Store.chartparam.luckysheetCurrentChartMoveWinW
          ) {
            left =
              Store.chartparam.luckysheetCurrentChartMoveWinW - myw - 22 - 36
          }

          Store.chartparam.luckysheetCurrentChartMoveObj.css({
            top: top,
            left: left,
          })

          if (
            luckysheetFreezen.freezenhorizontaldata != null ||
            luckysheetFreezen.freezenverticaldata != null
          ) {
            luckysheetFreezen.scrollAdapt()

            const toffset = Store.chartparam.luckysheetCurrentChartMoveObj.offset()
            const tpsition = Store.chartparam.luckysheetCurrentChartMoveObj.position()
            Store.chartparam.luckysheetCurrentChartMoveXy = [
              event.pageX - toffset.left,
              event.pageY - toffset.top,
              tpsition.left,
              tpsition.top,
              $('#luckysheet-scrollbar-x').scrollLeft(),
              $('#luckysheet-scrollbar-y').scrollTop(),
            ]
          }
        }
        // chart resize
        else if (!!Store.chartparam.luckysheetCurrentChartResize) {
          const scrollTop = $('#luckysheet-cell-main').scrollTop(),
            scrollLeft = $('#luckysheet-cell-main').scrollLeft()
          const mouse = mouseposition(event.pageX, event.pageY)
          const x = mouse[0] + scrollLeft
          const y = mouse[1] + scrollTop

          if (x < 0 || y < 0) {
            return false
          }

          const myh = Store.chartparam.luckysheetCurrentChartResizeObj.height(),
            myw = Store.chartparam.luckysheetCurrentChartResizeObj.width()
          const topchange =
            y - Store.chartparam.luckysheetCurrentChartResizeXy[1],
            leftchange = x - Store.chartparam.luckysheetCurrentChartResizeXy[0]

          let top = Store.chartparam.luckysheetCurrentChartResizeXy[5],
            height = Store.chartparam.luckysheetCurrentChartResizeXy[3],
            left = Store.chartparam.luckysheetCurrentChartResizeXy[4],
            width = Store.chartparam.luckysheetCurrentChartResizeXy[2]

          if (
            Store.chartparam.luckysheetCurrentChartResize == 'lm' ||
            Store.chartparam.luckysheetCurrentChartResize == 'lt' ||
            Store.chartparam.luckysheetCurrentChartResize == 'lb'
          ) {
            left = x
            width =
              Store.chartparam.luckysheetCurrentChartResizeXy[2] - leftchange
            if (
              left >
              Store.chartparam.luckysheetCurrentChartResizeXy[2] +
              Store.chartparam.luckysheetCurrentChartResizeXy[4] -
              60
            ) {
              left =
                Store.chartparam.luckysheetCurrentChartResizeXy[2] +
                Store.chartparam.luckysheetCurrentChartResizeXy[4] -
                60
              width =
                Store.chartparam.luckysheetCurrentChartResizeXy[2] -
                (Store.chartparam.luckysheetCurrentChartResizeXy[2] +
                  Store.chartparam.luckysheetCurrentChartResizeXy[4] -
                  60 -
                  Store.chartparam.luckysheetCurrentChartResizeXy[0])
            } else if (left <= 0) {
              left = 0
              width =
                Store.chartparam.luckysheetCurrentChartResizeXy[2] +
                Store.chartparam.luckysheetCurrentChartResizeXy[0]
            }
          }

          if (
            Store.chartparam.luckysheetCurrentChartResize == 'rm' ||
            Store.chartparam.luckysheetCurrentChartResize == 'rt' ||
            Store.chartparam.luckysheetCurrentChartResize == 'rb'
          ) {
            width =
              Store.chartparam.luckysheetCurrentChartResizeXy[2] + leftchange
            if (width < 60) {
              width = 60
            } else if (
              width >=
              Store.chartparam.luckysheetCurrentChartResizeWinW -
              Store.chartparam.luckysheetCurrentChartResizeXy[4] -
              22 -
              36
            ) {
              width =
                Store.chartparam.luckysheetCurrentChartResizeWinW -
                Store.chartparam.luckysheetCurrentChartResizeXy[4] -
                22 -
                36
            }
          }

          if (
            Store.chartparam.luckysheetCurrentChartResize == 'mt' ||
            Store.chartparam.luckysheetCurrentChartResize == 'lt' ||
            Store.chartparam.luckysheetCurrentChartResize == 'rt'
          ) {
            top = y
            height =
              Store.chartparam.luckysheetCurrentChartResizeXy[3] - topchange
            if (
              top >
              Store.chartparam.luckysheetCurrentChartResizeXy[3] +
              Store.chartparam.luckysheetCurrentChartResizeXy[5] -
              60
            ) {
              top =
                Store.chartparam.luckysheetCurrentChartResizeXy[3] +
                Store.chartparam.luckysheetCurrentChartResizeXy[5] -
                60
              height =
                Store.chartparam.luckysheetCurrentChartResizeXy[3] -
                (Store.chartparam.luckysheetCurrentChartResizeXy[3] +
                  Store.chartparam.luckysheetCurrentChartResizeXy[5] -
                  60 -
                  Store.chartparam.luckysheetCurrentChartResizeXy[1])
            } else if (top <= 0) {
              top = 0
              height =
                Store.chartparam.luckysheetCurrentChartResizeXy[3] +
                Store.chartparam.luckysheetCurrentChartResizeXy[1]
            }
          }

          if (
            Store.chartparam.luckysheetCurrentChartResize == 'mb' ||
            Store.chartparam.luckysheetCurrentChartResize == 'lb' ||
            Store.chartparam.luckysheetCurrentChartResize == 'rb'
          ) {
            height =
              Store.chartparam.luckysheetCurrentChartResizeXy[3] + topchange
            if (height < 60) {
              height = 60
            } else if (
              height >=
              Store.chartparam.luckysheetCurrentChartResizeWinH -
              Store.chartparam.luckysheetCurrentChartResizeXy[5] -
              42 -
              6
            ) {
              height =
                Store.chartparam.luckysheetCurrentChartResizeWinH -
                Store.chartparam.luckysheetCurrentChartResizeXy[5] -
                42 -
                6
            }
          }

          const resizedata = {
            top: top,
            left: left,
            height: height,
            width: width,
          }
          Store.chartparam.luckysheetCurrentChartResizeObj.css(resizedata)
          // resize chart
          Store.resizeChart(Store.chartparam.luckysheetCurrentChart)
        }
        //image move
        else if (imageCtrl.move) {
          let mouse = mouseposition(event.pageX, event.pageY)

          let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          let imgItem = imageCtrl.images[imageCtrl.currentImgId]
          if (imgItem.isFixedPos) {
            x = event.pageX
            y = event.pageY
          }

          let myh = $('#luckysheet-modal-dialog-activeImage').height(),
            myw = $('#luckysheet-modal-dialog-activeImage').width()

          let top = y - imageCtrl.moveXY[1],
            left = x - imageCtrl.moveXY[0]

          let minTop = 0,
            maxTop = imageCtrl.currentWinH - myh - 42 - 6,
            minLeft = 0,
            maxLeft = imageCtrl.currentWinW - myw - 22 - 36

          if (imgItem.isFixedPos) {
            minTop =
              Store.infobarHeight +
              Store.toolbarHeight +
              Store.calculatebarHeight +
              Store.columnHeaderHeight
            maxTop =
              minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - myh
            minLeft = Store.rowHeaderWidth
            maxLeft =
              minLeft + Store.cellmainWidth - Store.cellMainSrollBarSize - myw
          }

          if (top < minTop) {
            top = minTop
          }

          if (top > maxTop) {
            top = maxTop
          }

          if (left < minLeft) {
            left = minLeft
          }

          if (left > maxLeft) {
            left = maxLeft
          }

          $('#luckysheet-modal-dialog-activeImage').css({
            left: left,
            top: top,
          })
        }
        //image resize
        else if (!!imageCtrl.resize) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
          let scrollTop = $('#luckysheet-cell-main').scrollTop()
          let x = mouse[0] + scrollLeft
          let y = mouse[1] + scrollTop

          if (x < 0 || y < 0) {
            return false
          }

          let resizeXY = imageCtrl.resizeXY

          let topchange = y - resizeXY[1],
            leftchange = x - resizeXY[0]

          let top = resizeXY[5],
            height = resizeXY[3],
            left = resizeXY[4],
            width = resizeXY[2]

          let resize = imageCtrl.resize
          let imgItem = imageCtrl.images[imageCtrl.currentImgId]

          if (imgItem.isFixedPos) {
            let minTop =
              Store.infobarHeight +
              Store.toolbarHeight +
              Store.calculatebarHeight +
              Store.columnHeaderHeight
            let minLeft = Store.rowHeaderWidth

            if (resize == 'lt') {
              //左上
              left = resizeXY[4] - resizeXY[6] + leftchange

              if (left < minLeft) {
                left = minLeft
              }

              if (left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1) {
                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1
              }

              width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))
              top = resizeXY[5] - resizeXY[7] + resizeXY[3] - height

              if (top < minTop) {
                top = minTop
                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width
              }

              if (top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1) {
                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1
                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width
              }
            } else if (resize == 'lm') {
              //左中
              left = resizeXY[4] - resizeXY[6] + leftchange

              if (left < minLeft) {
                left = minLeft
              }

              if (left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1) {
                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1
              }

              width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left

              top = resizeXY[5] - resizeXY[7]
              height = resizeXY[3]
            } else if (resize == 'lb') {
              //左下
              left = resizeXY[4] - resizeXY[6] + leftchange

              if (left < minLeft) {
                left = minLeft
              }

              if (left > resizeXY[4] - resizeXY[6] + resizeXY[2] - 1) {
                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - 1
              }

              width = resizeXY[4] - resizeXY[6] + resizeXY[2] - left

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))

              top = resizeXY[5] - resizeXY[7]

              if (height < 1) {
                height = 1

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width
              }

              if (
                height >
                minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top
              ) {
                height =
                  minTop +
                  Store.cellmainHeight -
                  Store.cellMainSrollBarSize -
                  top

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[4] - resizeXY[6] + resizeXY[2] - width
              }
            } else if (resize == 'rt') {
              //右上
              left = resizeXY[4] - resizeXY[6]

              width = resizeXY[2] + leftchange

              if (width < 1) {
                width = 1
              }

              if (
                width >
                minLeft +
                Store.cellmainWidth -
                Store.cellMainSrollBarSize -
                left
              ) {
                width =
                  minLeft +
                  Store.cellmainWidth -
                  Store.cellMainSrollBarSize -
                  left
              }

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))
              top = resizeXY[5] - resizeXY[7] + resizeXY[3] - height

              if (top < minTop) {
                top = minTop
                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              }

              if (top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1) {
                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1
                height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              }
            } else if (resize == 'rm') {
              //右中
              left = resizeXY[4] - resizeXY[6]

              width = resizeXY[2] + leftchange

              if (width < 1) {
                width = 1
              }

              if (
                width >
                minLeft +
                Store.cellmainWidth -
                Store.cellMainSrollBarSize -
                left
              ) {
                width =
                  minLeft +
                  Store.cellmainWidth -
                  Store.cellMainSrollBarSize -
                  left
              }

              top = resizeXY[5] - resizeXY[7]
              height = resizeXY[3]
            } else if (resize == 'rb') {
              //右下
              left = resizeXY[4] - resizeXY[6]

              width = resizeXY[2] + leftchange

              if (width < 1) {
                width = 1
              }

              if (
                width >
                minLeft +
                Store.cellmainWidth -
                Store.cellMainSrollBarSize -
                left
              ) {
                width =
                  minLeft +
                  Store.cellmainWidth -
                  Store.cellMainSrollBarSize -
                  left
              }

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))
              top = resizeXY[5] - resizeXY[7]

              if (height < 1) {
                height = 1

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              }

              if (
                height >
                minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top
              ) {
                height =
                  minTop +
                  Store.cellmainHeight -
                  Store.cellMainSrollBarSize -
                  top

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              }
            } else if (resize == 'mt') {
              //中上
              left = resizeXY[4] - resizeXY[6]
              width = resizeXY[2]

              top = resizeXY[5] - resizeXY[7] + topchange

              if (top < minTop) {
                top = minTop
              }

              if (top > resizeXY[5] - resizeXY[7] + resizeXY[3] - 1) {
                top = resizeXY[5] - resizeXY[7] + resizeXY[3] - 1
              }

              height = resizeXY[5] - resizeXY[7] + resizeXY[3] - top
            } else if (resize == 'mb') {
              //中下
              left = resizeXY[4] - resizeXY[6]
              width = resizeXY[2]

              top = resizeXY[5] - resizeXY[7]

              height = resizeXY[3] + topchange

              if (height < 1) {
                height = 1
              }

              if (
                height >
                minTop + Store.cellmainHeight - Store.cellMainSrollBarSize - top
              ) {
                height =
                  minTop +
                  Store.cellmainHeight -
                  Store.cellMainSrollBarSize -
                  top
              }
            }
          } else {
            if (resize == 'lt') {
              //左上
              left = x
              width = resizeXY[2] - leftchange

              if (left > resizeXY[2] + resizeXY[4] - 1) {
                left = resizeXY[2] + resizeXY[4] - 1
                width =
                  resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1)
              } else if (left <= 0) {
                left = 0
                width = resizeXY[2] + resizeXY[0]
              }

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))
              top = resizeXY[3] + resizeXY[1] - height

              if (top > resizeXY[3] + resizeXY[5] - 1) {
                top = resizeXY[3] + resizeXY[5] - 1
                height =
                  resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1)

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[2] + resizeXY[0] - width
              } else if (top <= 0) {
                top = 0
                height = resizeXY[3] + resizeXY[1]

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[2] + resizeXY[0] - width
              }
            } else if (resize == 'lm') {
              //左中
              left = x
              width = resizeXY[2] - leftchange

              if (left > resizeXY[2] + resizeXY[4] - 1) {
                left = resizeXY[2] + resizeXY[4] - 1
                width =
                  resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1)
              } else if (left <= 0) {
                left = 0
                width = resizeXY[2] + resizeXY[0]
              }
            } else if (resize == 'lb') {
              //左下
              left = x
              width = resizeXY[2] - leftchange

              if (left > resizeXY[2] + resizeXY[4] - 1) {
                left = resizeXY[2] + resizeXY[4] - 1
                width =
                  resizeXY[2] + resizeXY[0] - (resizeXY[2] + resizeXY[4] - 1)
              } else if (left <= 0) {
                left = 0
                width = resizeXY[2] + resizeXY[0]
              }

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))

              if (height < 1) {
                height = 1

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[2] + resizeXY[0] - width
              } else if (
                height >=
                imageCtrl.currentWinH - resizeXY[5] - 42 - 6
              ) {
                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
                left = resizeXY[2] + resizeXY[0] - width
              }
            } else if (resize == 'rt') {
              //右上
              width = resizeXY[2] + leftchange

              if (width < 1) {
                width = 1
              } else if (
                width >=
                imageCtrl.currentWinW - resizeXY[4] - 22 - 36
              ) {
                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36
              }

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))
              top = resizeXY[3] + resizeXY[1] - height

              if (top > resizeXY[3] + resizeXY[5] - 1) {
                top = resizeXY[3] + resizeXY[5] - 1
                height =
                  resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1)

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              } else if (top <= 0) {
                top = 0
                height = resizeXY[3] + resizeXY[1]

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              }
            } else if (resize == 'rm') {
              //右中
              width = resizeXY[2] + leftchange

              if (width < 1) {
                width = 1
              } else if (
                width >=
                imageCtrl.currentWinW - resizeXY[4] - 22 - 36
              ) {
                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36
              }
            } else if (resize == 'rb') {
              //右下
              width = resizeXY[2] + leftchange

              if (width < 1) {
                width = 1
              } else if (
                width >=
                imageCtrl.currentWinW - resizeXY[4] - 22 - 36
              ) {
                width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36
              }

              height = Math.round(width * (resizeXY[3] / resizeXY[2]))

              if (height < 1) {
                height = 1

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              } else if (
                height >=
                imageCtrl.currentWinH - resizeXY[5] - 42 - 6
              ) {
                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6

                width = Math.round(height * (resizeXY[2] / resizeXY[3]))
              }
            } else if (resize == 'mt') {
              //中上
              top = y
              height = resizeXY[3] - topchange

              if (top > resizeXY[3] + resizeXY[5] - 1) {
                top = resizeXY[3] + resizeXY[5] - 1
                height =
                  resizeXY[3] + resizeXY[1] - (resizeXY[3] + resizeXY[5] - 1)
              } else if (top <= 0) {
                top = 0
                height = resizeXY[3] + resizeXY[1]
              }
            } else if (resize == 'mb') {
              //中下
              height = resizeXY[3] + topchange

              if (height < 1) {
                height = 1
              } else if (
                height >=
                imageCtrl.currentWinH - resizeXY[5] - 42 - 6
              ) {
                height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6
              }
            }
          }

          $('#luckysheet-modal-dialog-activeImage').css({
            width: width,
            height: height,
            left: left,
            top: top,
          })

          let scaleX = width / imgItem.crop.width
          let scaleY = height / imgItem.crop.height
          let defaultWidth = Math.round(imgItem.default.width * scaleX)
          let defaultHeight = Math.round(imgItem.default.height * scaleY)
          let offsetLeft = Math.round(imgItem.crop.offsetLeft * scaleX)
          let offsetTop = Math.round(imgItem.crop.offsetTop * scaleY)

          $(
            '#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content'
          ).css({
            'background-size': defaultWidth + 'px ' + defaultHeight + 'px',
            'background-position': -offsetLeft + 'px ' + -offsetTop + 'px',
          })
        }
        //image cropChange
        else if (!!imageCtrl.cropChange) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          if (x < 0 || y < 0) {
            return false
          }

          let cropChangeXY = imageCtrl.cropChangeXY

          let topchange = y - cropChangeXY[1],
            leftchange = x - cropChangeXY[0]

          let imgItem = imageCtrl.images[imageCtrl.currentImgId]
          let cropChange = imageCtrl.cropChange
          let width, height, offsetLeft, offsetTop

          if (cropChange == 'lt') {
            //左上
            offsetLeft = imgItem.crop.offsetLeft + leftchange

            if (offsetLeft < 0) {
              offsetLeft = 0
            }

            if (offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1) {
              offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1
            }

            width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft

            offsetTop = imgItem.crop.offsetTop + topchange

            if (offsetTop < 0) {
              offsetTop = 0
            }

            if (offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1) {
              offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1
            }

            height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop
          } else if (cropChange == 'lm') {
            //左中
            offsetLeft = imgItem.crop.offsetLeft + leftchange

            if (offsetLeft < 0) {
              offsetLeft = 0
            }

            if (offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1) {
              offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1
            }

            width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft

            offsetTop = imgItem.crop.offsetTop
            height = imgItem.crop.height
          } else if (cropChange == 'lb') {
            //左下
            offsetLeft = imgItem.crop.offsetLeft + leftchange

            if (offsetLeft < 0) {
              offsetLeft = 0
            }

            if (offsetLeft > imgItem.crop.width + imgItem.crop.offsetLeft - 1) {
              offsetLeft = imgItem.crop.width + imgItem.crop.offsetLeft - 1
            }

            width = imgItem.crop.width + imgItem.crop.offsetLeft - offsetLeft

            offsetTop = imgItem.crop.offsetTop

            height = imgItem.crop.height + topchange

            if (height < 1) {
              height = 1
            }

            if (height > imgItem.default.height - offsetTop) {
              height = imgItem.default.height - offsetTop
            }
          } else if (cropChange == 'rt') {
            //右上
            offsetLeft = imgItem.crop.offsetLeft

            width = imgItem.crop.width + leftchange

            if (width < 1) {
              width = 1
            }

            if (width > imgItem.default.width - offsetLeft) {
              width = imgItem.default.width - offsetLeft
            }

            offsetTop = imgItem.crop.offsetTop + topchange

            if (offsetTop < 0) {
              offsetTop = 0
            }

            if (offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1) {
              offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1
            }

            height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop
          } else if (cropChange == 'rm') {
            //右中
            offsetLeft = imgItem.crop.offsetLeft

            width = imgItem.crop.width + leftchange

            if (width < 1) {
              width = 1
            }

            if (width > imgItem.default.width - offsetLeft) {
              width = imgItem.default.width - offsetLeft
            }

            offsetTop = imgItem.crop.offsetTop
            height = imgItem.crop.height
          } else if (cropChange == 'rb') {
            //右下
            offsetLeft = imgItem.crop.offsetLeft

            width = imgItem.crop.width + leftchange

            if (width < 1) {
              width = 1
            }

            if (width > imgItem.default.width - offsetLeft) {
              width = imgItem.default.width - offsetLeft
            }

            offsetTop = imgItem.crop.offsetTop

            height = imgItem.crop.height + topchange

            if (height < 1) {
              height = 1
            }

            if (height > imgItem.default.height - offsetTop) {
              height = imgItem.default.height - offsetTop
            }
          } else if (cropChange == 'mt') {
            //中上
            offsetLeft = imgItem.crop.offsetLeft
            width = imgItem.crop.width

            offsetTop = imgItem.crop.offsetTop + topchange

            if (offsetTop < 0) {
              offsetTop = 0
            }

            if (offsetTop > imgItem.crop.height + imgItem.crop.offsetTop - 1) {
              offsetTop = imgItem.crop.height + imgItem.crop.offsetTop - 1
            }

            height = imgItem.crop.height + imgItem.crop.offsetTop - offsetTop
          } else if (cropChange == 'mb') {
            //中下
            offsetLeft = imgItem.crop.offsetLeft
            width = imgItem.crop.width

            offsetTop = imgItem.crop.offsetTop

            height = imgItem.crop.height + topchange

            if (height < 1) {
              height = 1
            }

            if (height > imgItem.default.height - offsetTop) {
              height = imgItem.default.height - offsetTop
            }
          }

          let left = imgItem.default.left + offsetLeft
          let top = imgItem.default.top + offsetTop

          if (imgItem.isFixedPos) {
            left = imgItem.fixedLeft + offsetLeft
            top = imgItem.fixedTop + offsetTop
          }

          $('#luckysheet-modal-dialog-cropping')
            .show()
            .css({
              width: width,
              height: height,
              left: left,
              top: top,
            })

          let imageUrlHandle =
            Store.toJsonOptions && Store.toJsonOptions['imageUrlHandle']
          let imgSrc =
            typeof imageUrlHandle === 'function'
              ? imageUrlHandle(imgItem.src)
              : imgItem.src

          $('#luckysheet-modal-dialog-cropping .cropping-mask').css({
            width: imgItem.default.width,
            height: imgItem.default.height,
            'background-image': 'url(' + imgSrc + ')',
            left: -offsetLeft,
            top: -offsetTop,
          })

          $('#luckysheet-modal-dialog-cropping .cropping-content').css({
            'background-image': 'url(' + imgSrc + ')',
            'background-size':
              imgItem.default.width + 'px ' + imgItem.default.height + 'px',
            'background-position': -offsetLeft + 'px ' + -offsetTop + 'px',
          })

          imageCtrl.cropChangeObj = {
            width: width,
            height: height,
            offsetLeft: offsetLeft,
            offsetTop: offsetTop,
          }
        } else if (luckysheetPostil.move) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          let myh = luckysheetPostil.currentObj.outerHeight(),
            myw = luckysheetPostil.currentObj.outerWidth()

          let top = y - luckysheetPostil.moveXY[1],
            left = x - luckysheetPostil.moveXY[0]

          if (top < 0) {
            top = 0
          }

          if (top + myh + 42 + 6 > luckysheetPostil.currentWinH) {
            top = luckysheetPostil.currentWinH - myh - 42 - 6
          }

          if (left < 0) {
            left = 0
          }

          if (left + myw + 22 + 36 > luckysheetPostil.currentWinW) {
            left = luckysheetPostil.currentWinW - myw - 22 - 36
          }

          luckysheetPostil.currentObj.css({ left: left, top: top })
        } else if (!!luckysheetPostil.resize) {
          let mouse = mouseposition(event.pageX, event.pageY)
          let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
          let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

          if (x < 0 || y < 0) {
            return false
          }

          let resizeXY = luckysheetPostil.resizeXY

          let topchange = y - resizeXY[1],
            leftchange = x - resizeXY[0]

          let top = resizeXY[5],
            height = resizeXY[3],
            left = resizeXY[4],
            width = resizeXY[2]

          let resize = luckysheetPostil.resize

          if (resize == 'lm' || resize == 'lt' || resize == 'lb') {
            left = x
            width = resizeXY[2] - leftchange

            if (left > resizeXY[2] + resizeXY[4] - 60) {
              left = resizeXY[2] + resizeXY[4] - 60
              width =
                resizeXY[2] - (resizeXY[2] + resizeXY[4] - 60 - resizeXY[0])
            } else if (left <= 0) {
              left = 0
              width = resizeXY[2] + resizeXY[0]
            }
          }

          if (resize == 'rm' || resize == 'rt' || resize == 'rb') {
            width = resizeXY[2] + leftchange

            if (width < 60) {
              width = 60
            } else if (
              width >=
              luckysheetPostil.currentWinW - resizeXY[4] - 22 - 36
            ) {
              width = luckysheetPostil.currentWinW - resizeXY[4] - 22 - 36
            }
          }

          if (resize == 'mt' || resize == 'lt' || resize == 'rt') {
            top = y
            height = resizeXY[3] - topchange

            if (top > resizeXY[3] + resizeXY[5] - 60) {
              top = resizeXY[3] + resizeXY[5] - 60
              height =
                resizeXY[3] - (resizeXY[3] + resizeXY[5] - 60 - resizeXY[1])
            } else if (top <= 0) {
              top = 0
              height = resizeXY[3] + resizeXY[1]
            }
          }

          if (resize == 'mb' || resize == 'lb' || resize == 'rb') {
            height = resizeXY[3] + topchange

            if (height < 60) {
              height = 60
            } else if (
              height >=
              luckysheetPostil.currentWinH - resizeXY[5] - 42 - 6
            ) {
              height = luckysheetPostil.currentWinH - resizeXY[5] - 42 - 6
            }
          }

          luckysheetPostil.currentObj.css({
            width: width,
            height: height,
            left: left,
            top: top,
          })
        } else if (!!formula.rangeResize) {
          formula.rangeResizeDraging(
            event,
            formula.rangeResizeObj,
            formula.rangeResizexy,
            formula.rangeResize,
            formula.rangeResizeWinW,
            formula.rangeResizeWinH,
            Store.ch_width,
            Store.rh_height
          )
        } else if (!!formula.rangeMove) {
          formula.rangeMoveDraging(
            event,
            formula.rangeMovexy,
            formula.rangeMoveObj.data('range'),
            formula.rangeMoveObj,
            Store.sheetBarHeight,
            Store.statisticBarHeight
          )
        } else if (!!Store.chart_selection.rangeResize) {
          Store.chart_selection.rangeResizeDraging(
            event,
            Store.sheetBarHeight,
            Store.statisticBarHeight
          )
        } else if (!!Store.chart_selection.rangeMove) {
          Store.chart_selection.rangeMoveDraging(
            event,
            Store.sheetBarHeight,
            Store.statisticBarHeight
          )
        }

        Store.jfautoscrollTimeout = window.requestAnimationFrame(mouseRender)
      }

      Store.jfautoscrollTimeout = window.requestAnimationFrame(mouseRender)
    }
  })
  //表格mouseup
  $(document).on('mouseup.luckysheetEvent', function (event) {
    if (
      luckysheetConfigsetting &&
      luckysheetConfigsetting.hook &&
      luckysheetConfigsetting.hook.sheetMouseup
    ) {
      let mouse = mouseposition(event.pageX, event.pageY)
      let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
      let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

      let row_location = rowLocation(y),
        row = row_location[1],
        row_pre = row_location[0],
        row_index = row_location[2]
      let col_location = colLocation(x),
        col = col_location[1],
        col_pre = col_location[0],
        col_index = col_location[2]

      let margeset = menuButton.mergeborer(Store.flowdata, row_index, col_index)
      if (!!margeset) {
        row = margeset.row[1]
        row_pre = margeset.row[0]
        row_index = margeset.row[2]

        col = margeset.column[1]
        col_pre = margeset.column[0]
        col_index = margeset.column[2]
      }

      // if(Store.flowdata[row_index] && Store.flowdata[row_index][col_index]){
      let sheetFile = sheetmanage.getSheetByIndex()

      let moveState = {
        functionResizeStatus: formula.functionResizeStatus,
        horizontalmoveState: !!luckysheetFreezen.horizontalmovestate,
        verticalmoveState: !!luckysheetFreezen.verticalmovestate,
        pivotTableMoveState: !!pivotTable && pivotTable.movestate,
        sheetMoveStatus: Store.luckysheet_sheet_move_status,
        scrollStatus: !!Store.luckysheet_scroll_status,
        selectStatus: !!Store.luckysheet_select_status,
        rowsSelectedStatus: !!Store.luckysheet_rows_selected_status,
        colsSelectedStatus: !!Store.luckysheet_cols_selected_status,
        cellSelectedMove: !!Store.luckysheet_cell_selected_move,
        cellSelectedExtend: !!Store.luckysheet_cell_selected_extend,
        colsChangeSize: !!Store.luckysheet_cols_change_size,
        rowsChangeSize: !!Store.luckysheet_rows_change_size,
        chartMove: !!Store.chartparam.luckysheetCurrentChartMove,
        chartResize: !!Store.chartparam.luckysheetCurrentChartResize,
        rangeResize: !!formula.rangeResize,
        rangeMove: !!formula.rangeMove,
      }

      let luckysheetTableContent = $('#luckysheetTableContent')
        .get(0)
        .getContext('2d')
      method.createHookFunction(
        'sheetMouseup',
        Store.flowdata[row_index][col_index],
        {
          r: row_index,
          c: col_index,
          start_r: row_pre,
          start_c: col_pre,
          end_r: row,
          end_c: col,
        },
        sheetFile,
        moveState,
        luckysheetTableContent
      )
      // }
    }

    //数据窗格主体
    if (Store.luckysheet_select_status) {
      clearTimeout(Store.countfuncTimeout)
      Store.countfuncTimeout = setTimeout(function () {
        countfunc()
      }, 0)

      //格式刷
      if (menuButton.luckysheetPaintModelOn) {
        selection.pasteHandlerOfPaintModel(Store.luckysheet_copy_save)

        if (menuButton.luckysheetPaintSingle) {
          //单次 格式刷
          menuButton.cancelPaintModel()
        }
      }
    }

    Store.luckysheet_select_status = false
    window.cancelAnimationFrame(Store.jfautoscrollTimeout)
    Store.luckysheet_scroll_status = false

    $('#luckysheet-cell-selected')
      .find('.luckysheet-cs-fillhandle')
      .css('cursor', 'crosshair')
      .end()
      .find('.luckysheet-cs-draghandle')
      .css('cursor', 'move')
    $(
      '#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0'
    ).css('cursor', 'default')

    //行标题窗格主体
    Store.luckysheet_rows_selected_status = false

    //列标题窗格主体
    Store.luckysheet_cols_selected_status = false

    Store.luckysheet_model_move_state = false

    if (formula.functionResizeStatus) {
      formula.functionResizeStatus = false
      $('#luckysheet-wa-calculate-size').removeAttr('style')
    }

    if (!!luckysheetFreezen.horizontalmovestate) {
      luckysheetFreezen.horizontalmovestate = false
      $('#luckysheet-freezebar-horizontal').removeClass(
        'luckysheet-freezebar-active'
      )
      $('#luckysheet-freezebar-horizontal')
        .find('.luckysheet-freezebar-horizontal-handle')
        .css('cursor', '-webkit-grab')
      if (
        luckysheetFreezen.freezenhorizontaldata[4] <= Store.columnHeaderHeight
      ) {
        luckysheetFreezen.cancelFreezenHorizontal()
      }
      luckysheetFreezen.createAssistCanvas()
      luckysheetrefreshgrid()
    }

    if (!!luckysheetFreezen.verticalmovestate) {
      luckysheetFreezen.verticalmovestate = false
      $('#luckysheet-freezebar-vertical').removeClass(
        'luckysheet-freezebar-active'
      )
      $('#luckysheet-freezebar-vertical')
        .find('.luckysheet-freezebar-vertical-handle')
        .css('cursor', '-webkit-grab')
      if (luckysheetFreezen.freezenverticaldata[4] <= Store.rowHeaderWidth) {
        luckysheetFreezen.cancelFreezenVertical()
      }
      luckysheetFreezen.createAssistCanvas()
      luckysheetrefreshgrid()
    }

    if (!!pivotTable && pivotTable.movestate) {
      $('#luckysheet-modal-dialog-slider-pivot-move').remove()
      pivotTable.movestate = false
      $(
        '#luckysheet-modal-dialog-pivotTable-list, #luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value'
      ).css('cursor', 'default')
      if (
        pivotTable.movesave.containerid !=
        'luckysheet-modal-dialog-pivotTable-list'
      ) {
        let $cur = $(event.target).closest(
          '.luckysheet-modal-dialog-slider-config-list'
        )
        if ($cur.length == 0) {
          if (
            pivotTable.movesave.containerid ==
            'luckysheet-modal-dialog-config-value'
          ) {
            pivotTable.resetOrderby(pivotTable.movesave.obj)
          }

          pivotTable.movesave.obj.remove()
          pivotTable.showvaluecolrow()
          $('#luckysheet-modal-dialog-pivotTable-list')
            .find('.luckysheet-modal-dialog-slider-list-item')
            .each(function () {
              $(this)
                .find('.luckysheet-slider-list-item-selected')
                .find('i')
                .remove()
            })

          $(
            '#luckysheet-modal-dialog-config-filter, #luckysheet-modal-dialog-config-row, #luckysheet-modal-dialog-config-column, #luckysheet-modal-dialog-config-value'
          )
            .find('.luckysheet-modal-dialog-slider-config-item')
            .each(function () {
              let index = $(this).data('index')

              $('#luckysheet-modal-dialog-pivotTable-list')
                .find('.luckysheet-modal-dialog-slider-list-item')
                .each(function () {
                  let $seleted = $(this).find(
                    '.luckysheet-slider-list-item-selected'
                  )
                  if (
                    $(this).data('index') == index &&
                    $seleted.find('i').length == 0
                  ) {
                    $seleted.append(
                      '<i class="fa fa-check luckysheet-mousedown-cancel"></i>'
                    )
                  }
                })
            })

          pivotTable.refreshPivotTable()
        }
      }
    }

    if (Store.luckysheet_sheet_move_status) {
      Store.luckysheet_sheet_move_status = false
      Store.luckysheet_sheet_move_data.activeobject.insertBefore(
        $('#luckysheet-sheets-item-clone')
      )
      Store.luckysheet_sheet_move_data.activeobject.removeAttr('style')
      $('#luckysheet-sheets-item-clone').remove()
      Store.luckysheet_sheet_move_data.cursorobject.css({ cursor: 'pointer' })
      Store.luckysheet_sheet_move_data = {}
      sheetmanage.reOrderAllSheet()
    }

    // chart move debounce timer clear
    clearTimeout(Store.chartparam.luckysheetCurrentChartMoveTimeout)

    //图表拖动 chartMix
    if (!!Store.chartparam.luckysheetCurrentChartMove) {
      Store.chartparam.luckysheetCurrentChartMove = false
      if (Store.chartparam.luckysheetInsertChartTosheetChange) {
        //myTop, myLeft: 本次的chart框位置，scrollLeft,scrollTop: 上一次的滚动条位置
        var myTop = Store.chartparam.luckysheetCurrentChartMoveObj.css('top'),
          myLeft = Store.chartparam.luckysheetCurrentChartMoveObj.css('left'),
          scrollLeft = $('#luckysheet-cell-main').scrollLeft(),
          scrollTop = $('#luckysheet-cell-main').scrollTop()

        //点击时候存储的信息，即上一次操作结束的图表信息，x,y: chart框位置，scrollLeft1,scrollTop1: 滚动条位置
        var x = Store.chartparam.luckysheetCurrentChartMoveXy[2]
        var y = Store.chartparam.luckysheetCurrentChartMoveXy[3]

        var scrollLeft1 = Store.chartparam.luckysheetCurrentChartMoveXy[4]
        var scrollTop1 = Store.chartparam.luckysheetCurrentChartMoveXy[5]

        var chart_id = Store.chartparam.luckysheetCurrentChartMoveObj
          .find('.luckysheet-modal-dialog-content')
          .attr('id')

        //去除chartobj,改用chart_id代替即可定位到此图表
        Store.jfredo.push({
          type: 'moveChart',
          chart_id: chart_id,
          sheetIndex: Store.currentSheetIndex,
          myTop: myTop,
          myLeft: myLeft,
          scrollTop: scrollTop,
          scrollLeft: scrollLeft,
          x: x,
          y: y,
          scrollTop1: scrollTop1,
          scrollLeft1: scrollLeft1,
        })

        // window.luckysheet.sheetmanage.saveChart({ "chart_id": chart_id, "sheetIndex": sheetIndex, "top": myTop, "left": myLeft });
        //存储滚动条位置//协同编辑时可能影响用户操作，可以考虑不存储滚动条位置,或者滚动条信息仅仅保存到后台，但是不分发到其他设备（google sheet没有存储滚动条位置）
        // Store.server.saveParam("c", sheetIndex, { "left":myLeft, "top":myTop,"scrollTop": scrollTop, "scrollLeft": scrollLeft }, { "op":"xy", "cid": chart_id});
      }
    }

    //图表改变大小 chartMix
    if (!!Store.chartparam.luckysheetCurrentChartResize) {
      Store.chartparam.luckysheetCurrentChartResize = null
      if (Store.chartparam.luckysheetInsertChartTosheetChange) {
        var myHeight = Store.chartparam.luckysheetCurrentChartResizeObj.height(),
          myWidth = Store.chartparam.luckysheetCurrentChartResizeObj.width(),
          scrollLeft = $('#luckysheet-cell-main').scrollLeft(),
          scrollTop = $('#luckysheet-cell-main').scrollTop()

        var myTop = Store.chartparam.luckysheetCurrentChartMoveObj.css('top'),
          myLeft = Store.chartparam.luckysheetCurrentChartMoveObj.css('left')

        var chart_id = Store.chartparam.luckysheetCurrentChartResizeObj
          .find('.luckysheet-modal-dialog-content')
          .attr('id')

        var myWidth1 = Store.chartparam.luckysheetCurrentChartResizeXy[2]
        var myHeight1 = Store.chartparam.luckysheetCurrentChartResizeXy[3]
        var x = Store.chartparam.luckysheetCurrentChartResizeXy[4] //增加上一次的位置x，y
        var y = Store.chartparam.luckysheetCurrentChartResizeXy[5]
        var scrollLeft1 = Store.chartparam.luckysheetCurrentChartResizeXy[6]
        var scrollTop1 = Store.chartparam.luckysheetCurrentChartResizeXy[7]

        Store.jfredo.push({
          type: 'resizeChart',
          chart_id: chart_id,
          sheetIndex: Store.currentSheetIndex,
          myTop: myTop,
          myLeft: myLeft,
          myHeight: myHeight,
          myWidth: myWidth,
          scrollTop: scrollTop,
          scrollLeft: scrollLeft,
          x: x,
          y: y,
          myWidth1: myWidth1,
          myHeight1: myHeight1,
          scrollTop1: scrollTop1,
          scrollLeft1: scrollLeft1,
        })

        //加上滚动条的位置
        // window.luckysheet.sheetmanage.saveChart({ "chart_id": chart_id, "sheetIndex": sheetIndex, "height": myHeight, "width": myWidth, "top": myTop, "left": myLeft, "scrollTop": scrollTop, "scrollLeft": scrollLeft });

        // Store.server.saveParam("c", sheetIndex, { "width":myWidth, "height":myHeight, "top": myTop, "left": myLeft, "scrollTop": scrollTop, "scrollLeft": scrollLeft}, { "op":"wh", "cid": chart_id});
      }
    }

    if (!!formula.rangeResize) {
      formula.rangeResizeDragged(
        event,
        formula.rangeResizeObj,
        formula.rangeResize,
        formula.rangeResizexy,
        formula.rangeResizeWinW,
        formula.rangeResizeWinH
      )
    }

    //image move
    if (imageCtrl.move) {
      imageCtrl.moveImgItem()
    }

    //image resize
    if (imageCtrl.resize) {
      imageCtrl.resizeImgItem()
    }

    //image cropChange
    if (imageCtrl.cropChange) {
      imageCtrl.cropChangeImgItem()
    }

    //批注框 移动
    if (luckysheetPostil.move) {
      luckysheetPostil.move = false

      let ps_id = luckysheetPostil.currentObj
        .closest('.luckysheet-postil-show')
        .attr('id')

      let ps_r = ps_id.split('luckysheet-postil-show_')[1].split('_')[0]
      let ps_c = ps_id.split('luckysheet-postil-show_')[1].split('_')[1]

      let d = editor.deepCopyFlowData(Store.flowdata)
      let rc = []

      d[ps_r][ps_c].ps.left = luckysheetPostil.currentObj.position().left
      d[ps_r][ps_c].ps.top = luckysheetPostil.currentObj.position().top
      d[ps_r][ps_c].ps.value = luckysheetPostil.currentObj
        .find('.formulaInputFocus')
        .html()
        .replaceAll('<div>', '\n')
        .replaceAll(/<(.*)>.*?|<(.*) \/>/g, '')
        .trim()

      rc.push(ps_r + '_' + ps_c)

      luckysheetPostil.ref(d, rc)

      $('#' + ps_id).remove()

      if (d[ps_r][ps_c].ps.isshow) {
        luckysheetPostil.buildPs(ps_r, ps_c, d[ps_r][ps_c].ps)
        $('#' + ps_id).addClass('luckysheet-postil-show-active')
        $('#' + ps_id)
          .find('.luckysheet-postil-dialog-resize')
          .show()
      } else {
        luckysheetPostil.editPs(ps_r, ps_c)
      }
    }

    //批注框 改变大小
    if (!!luckysheetPostil.resize) {
      luckysheetPostil.resize = null

      let ps_id = luckysheetPostil.currentObj
        .closest('.luckysheet-postil-show')
        .attr('id')

      let ps_r = ps_id.split('luckysheet-postil-show_')[1].split('_')[0]
      let ps_c = ps_id.split('luckysheet-postil-show_')[1].split('_')[1]

      let d = editor.deepCopyFlowData(Store.flowdata)
      let rc = []

      d[ps_r][ps_c].ps.left = luckysheetPostil.currentObj.position().left
      d[ps_r][ps_c].ps.top = luckysheetPostil.currentObj.position().top
      d[ps_r][ps_c].ps.width = luckysheetPostil.currentObj.outerWidth()
      d[ps_r][ps_c].ps.height = luckysheetPostil.currentObj.outerHeight()
      d[ps_r][ps_c].ps.value = luckysheetPostil.currentObj
        .find('.formulaInputFocus')
        .html()
        .replaceAll('<div>', '\n')
        .replaceAll(/<(.*)>.*?|<(.*) \/>/g, '')
        .trim()

      rc.push(ps_r + '_' + ps_c)

      luckysheetPostil.ref(d, rc)

      $('#' + ps_id).remove()

      if (d[ps_r][ps_c].ps.isshow) {
        luckysheetPostil.buildPs(ps_r, ps_c, d[ps_r][ps_c].ps)
        $('#' + ps_id).addClass('luckysheet-postil-show-active')
        $('#' + ps_id)
          .find('.luckysheet-postil-dialog-resize')
          .show()
      } else {
        luckysheetPostil.editPs(ps_r, ps_c)
      }
    }

    //改变行高
    if (Store.luckysheet_rows_change_size) {
      Store.luckysheet_rows_change_size = false

      $('#luckysheet-change-size-line').hide()
      $('#luckysheet-rows-change-size').css('opacity', 0)
      $(
        '#luckysheet-sheettable, #luckysheet-rows-h, #luckysheet-rows-h canvas'
      ).css('cursor', 'default')

      let mouse = mouseposition(event.pageX, event.pageY)
      let scrollTop = $('#luckysheet-rows-h').scrollTop()
      let y = mouse[1] + scrollTop
      let winH = $(window).height()

      let row_location = rowLocation(y),
        row = row_location[1],
        row_pre = row_location[0],
        row_index = row_location[2]

      let size = y + 3 - Store.luckysheet_rows_change_size_start[0]

      if (y + 3 - Store.luckysheet_rows_change_size_start[0] < 19) {
        size = 19
      }

      if (y >= winH - 200 + scrollTop) {
        size =
          winH - 200 - Store.luckysheet_rows_change_size_start[0] + scrollTop
      }

      let cfg = $.extend(true, {}, Store.config)
      if (cfg['rowlen'] == null) {
        cfg['rowlen'] = {}
      }

      if (cfg['customHeight'] == null) {
        cfg['customHeight'] = {}
      }

      cfg['customHeight'][Store.luckysheet_rows_change_size_start[1]] = 1

      const changeRowIndex = Store.luckysheet_rows_change_size_start[1]
      let changeRowSelected = false
      if (Store['luckysheet_select_save'].length > 0) {
        Store['luckysheet_select_save']
          .filter((select) => select.row_select)
          .some((select) => {
            if (
              changeRowIndex >= select.row[0] &&
              changeRowIndex <= select.row[1]
            ) {
              changeRowSelected = true
            }
            return changeRowSelected
          })
      }
      if (changeRowSelected) {
        Store['luckysheet_select_save']
          .filter((select) => select.row_select)
          .forEach((select) => {
            for (let r = select.row[0]; r <= select.row[1]; r++) {
              cfg['rowlen'][r] = Math.ceil(size / Store.zoomRatio)
            }
          })
      } else {
        cfg['rowlen'][Store.luckysheet_rows_change_size_start[1]] = Math.ceil(
          size / Store.zoomRatio
        )
      }

      let images = imageCtrl.moveChangeSize(
        'row',
        Store.luckysheet_rows_change_size_start[1],
        size
      )

      if (Store.clearjfundo) {
        Store.jfundo.length = 0

        Store.jfredo.push({
          type: 'resize',
          ctrlType: 'resizeR',
          sheetIndex: Store.currentSheetIndex,
          config: $.extend(true, {}, Store.config),
          curconfig: $.extend(true, {}, cfg),
          images: $.extend(true, {}, imageCtrl.images),
          curImages: $.extend(true, {}, images),
        })
      }

      //config
      Store.config = cfg
      Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config =
        Store.config

      server.saveParam('cg', Store.currentSheetIndex, cfg['rowlen'], {
        k: 'rowlen',
      })

      //images
      Store.luckysheetfile[
        getSheetIndex(Store.currentSheetIndex)
      ].images = images
      server.saveParam('all', Store.currentSheetIndex, images, { k: 'images' })
      imageCtrl.images = images
      imageCtrl.allImagesShow()

      jfrefreshgrid_rhcw(Store.flowdata.length, null)
    }

    //改变列宽
    if (Store.luckysheet_cols_change_size) {
      Store.luckysheet_cols_change_size = false
      $('#luckysheet-change-size-line').hide()
      $('#luckysheet-cols-change-size').css('opacity', 0)
      $(
        '#luckysheet-sheettable, #luckysheet-cols-h-c, .luckysheet-cols-h-cells, .luckysheet-cols-h-cells canvas'
      ).css('cursor', 'default')

      let mouse = mouseposition(event.pageX, event.pageY)
      let scrollLeft = $('#luckysheet-cols-h-c').scrollLeft()
      let x = mouse[0] + scrollLeft
      let winW = $(window).width()

      let row_index = Store.visibledatarow.length - 1,
        row = Store.visibledatarow[row_index],
        row_pre = 0
      let col_location = colLocation(x),
        col = col_location[1],
        col_pre = col_location[0],
        col_index = col_location[2]
      let size = x + 3 - Store.luckysheet_cols_change_size_start[0]

      let firstcolumnlen = Store.defaultcollen
      if (
        Store.config['columnlen'] != null &&
        Store.config['columnlen'][Store.luckysheet_cols_change_size_start[1]] !=
        null
      ) {
        firstcolumnlen =
          Store.config['columnlen'][Store.luckysheet_cols_change_size_start[1]]
      }

      if (Math.abs(size - firstcolumnlen) < 3) {
        return
      }
      if (x + 3 - Store.luckysheet_cols_change_size_start[0] < 30) {
        size = 30
      }

      if (x >= winW - 100 + scrollLeft) {
        size =
          winW - 100 - Store.luckysheet_cols_change_size_start[0] + scrollLeft
      }

      let cfg = $.extend(true, {}, Store.config)
      if (cfg['columnlen'] == null) {
        cfg['columnlen'] = {}
      }

      if (cfg['customWidth'] == null) {
        cfg['customWidth'] = {}
      }

      cfg['customWidth'][Store.luckysheet_cols_change_size_start[1]] = 1

      const changeColumnIndex = Store.luckysheet_cols_change_size_start[1]
      let changeColumnSelected = false
      if (Store['luckysheet_select_save'].length > 0) {
        Store['luckysheet_select_save']
          .filter((select) => select.column_select)
          .some((select) => {
            if (
              changeColumnIndex >= select.column[0] &&
              changeColumnIndex <= select.column[1]
            ) {
              changeColumnSelected = true
            }
            return changeColumnSelected
          })
      }
      if (changeColumnSelected) {
        Store['luckysheet_select_save']
          .filter((select) => select.column_select)
          .forEach((select) => {
            for (let r = select.column[0]; r <= select.column[1]; r++) {
              cfg['columnlen'][r] = Math.ceil(size / Store.zoomRatio)
            }
          })
      } else {
        cfg['columnlen'][
          Store.luckysheet_cols_change_size_start[1]
        ] = Math.ceil(size / Store.zoomRatio)
      }

      let images = imageCtrl.moveChangeSize(
        'column',
        Store.luckysheet_cols_change_size_start[1],
        size
      )

      if (Store.clearjfundo) {
        Store.jfundo.length = 0

        Store.jfredo.push({
          type: 'resize',
          ctrlType: 'resizeC',
          sheetIndex: Store.currentSheetIndex,
          config: $.extend(true, {}, Store.config),
          curconfig: $.extend(true, {}, cfg),
          images: $.extend(true, {}, imageCtrl.images),
          curImages: $.extend(true, {}, images),
        })
      }

      //config
      Store.config = cfg
      Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config =
        Store.config

      server.saveParam('cg', Store.currentSheetIndex, cfg['columnlen'], {
        k: 'columnlen',
      })

      //images
      Store.luckysheetfile[
        getSheetIndex(Store.currentSheetIndex)
      ].images = images
      server.saveParam('all', Store.currentSheetIndex, images, { k: 'images' })
      imageCtrl.images = images
      imageCtrl.allImagesShow()

      jfrefreshgrid_rhcw(null, Store.flowdata[0].length)

      setTimeout(function () {
        luckysheetrefreshgrid()
      }, 1)
    }

    if (formula.rangeMove) {
      formula.rangeMoveDragged(formula.rangeMoveObj)
    }

    //改变选择框的位置并替换目标单元格
    if (Store.luckysheet_cell_selected_move) {
      $('#luckysheet-cell-selected-move').hide()

      Store.luckysheet_cell_selected_move = false
      let mouse = mouseposition(event.pageX, event.pageY)

      if (
        !checkProtectionLockedRangeList(
          Store.luckysheet_select_save,
          Store.currentSheetIndex
        )
      ) {
        return
      }

      let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
      let scrollTop = $('#luckysheet-cell-main').scrollTop()

      let x = mouse[0] + scrollLeft
      let y = mouse[1] + scrollTop

      let winH =
        $(window).height() +
        scrollTop -
        Store.sheetBarHeight -
        Store.statisticBarHeight,
        winW = $(window).width() + scrollLeft

      let row_index = rowLocation(y)[2]
      let col_index = colLocation(x)[2]

      let row_index_original = Store.luckysheet_cell_selected_move_index[0],
        col_index_original = Store.luckysheet_cell_selected_move_index[1]

      if (row_index == row_index_original && col_index == col_index_original) {
        return
      }

      let d = editor.deepCopyFlowData(Store.flowdata)
      let last =
        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]

      let data = getdatabyselection(last)

      let cfg = $.extend(true, {}, Store.config)
      if (cfg['merge'] == null) {
        cfg['merge'] = {}
      }
      if (cfg['rowlen'] == null) {
        cfg['rowlen'] = {}
      }

      //选区包含部分单元格
      if (
        hasPartMC(
          cfg,
          last['row'][0],
          last['row'][1],
          last['column'][0],
          last['column'][1]
        )
      ) {
        if (isEditMode()) {
          alert(locale_drag.noMerge)
        } else {
          tooltip.info(
            '<i class="fa fa-exclamation-triangle"></i>',
            locale_drag.noMerge
          )
        }
        return
      }

      let row_s = last['row'][0] - row_index_original + row_index,
        row_e = last['row'][1] - row_index_original + row_index
      let col_s = last['column'][0] - col_index_original + col_index,
        col_e = last['column'][1] - col_index_original + col_index

      if (
        !checkProtectionLockedRangeList(
          [{ row: [row_s, row_e], column: [col_s, col_e] }],
          Store.currentSheetIndex
        )
      ) {
        return
      }

      if (row_s < 0 || y < 0) {
        row_s = 0
        row_e = last['row'][1] - last['row'][0]
      }

      if (col_s < 0 || x < 0) {
        col_s = 0
        col_e = last['column'][1] - last['column'][0]
      }

      if (
        row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] ||
        y > winH
      ) {
        row_s =
          Store.visibledatarow.length - 1 - last['row'][1] + last['row'][0]
        row_e = Store.visibledatarow.length - 1
      }

      if (
        col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] ||
        x > winW
      ) {
        col_s =
          Store.visibledatacolumn.length -
          1 -
          last['column'][1] +
          last['column'][0]
        col_e = Store.visibledatacolumn.length - 1
      }

      //替换的位置包含部分单元格
      if (hasPartMC(cfg, row_s, row_e, col_s, col_e)) {
        if (isEditMode()) {
          alert(locale_drag.noMerge)
        } else {
          tooltip.info(
            '<i class="fa fa-exclamation-triangle"></i>',
            locale_drag.noMerge
          )
        }
        return
      }

      let borderInfoCompute = getBorderInfoCompute(Store.currentSheetIndex)

      //删除原本位置的数据
      let RowlChange = null
      for (let r = last['row'][0]; r <= last['row'][1]; r++) {
        if (r in cfg['rowlen']) {
          RowlChange = true
        }

        for (let c = last['column'][0]; c <= last['column'][1]; c++) {
          let cell = d[r][c]

          if (getObjType(cell) == 'object' && 'mc' in cell) {
            if (cell['mc'].r + '_' + cell['mc'].c in cfg['merge']) {
              delete cfg['merge'][cell['mc'].r + '_' + cell['mc'].c]
            }
          }

          d[r][c] = null
        }
      }

      //边框
      if (cfg['borderInfo'] && cfg['borderInfo'].length > 0) {
        let borderInfo = []

        for (let i = 0; i < cfg['borderInfo'].length; i++) {
          let bd_rangeType = cfg['borderInfo'][i].rangeType

          if (bd_rangeType == 'range') {
            let bd_range = cfg['borderInfo'][i].range
            let bd_emptyRange = []

            for (let j = 0; j < bd_range.length; j++) {
              bd_emptyRange = bd_emptyRange.concat(
                conditionformat.CFSplitRange(
                  bd_range[j],
                  { row: last['row'], column: last['column'] },
                  { row: [row_s, row_e], column: [col_s, col_e] },
                  'restPart'
                )
              )
            }

            cfg['borderInfo'][i].range = bd_emptyRange

            borderInfo.push(cfg['borderInfo'][i])
          } else if (bd_rangeType == 'cell') {
            let bd_r = cfg['borderInfo'][i].value.row_index
            let bd_c = cfg['borderInfo'][i].value.col_index

            if (
              !(
                bd_r >= last['row'][0] &&
                bd_r <= last['row'][1] &&
                bd_c >= last['column'][0] &&
                bd_c <= last['column'][1]
              )
            ) {
              borderInfo.push(cfg['borderInfo'][i])
            }
          }
        }

        cfg['borderInfo'] = borderInfo
      }
      //替换位置数据更新
      let offsetMC = {}
      for (let r = 0; r < data.length; r++) {
        for (let c = 0; c < data[0].length; c++) {
          if (
            borderInfoCompute[
            r + last['row'][0] + '_' + (c + last['column'][0])
            ]
          ) {
            let bd_obj = {
              rangeType: 'cell',
              value: {
                row_index: r + row_s,
                col_index: c + col_s,
                l:
                  borderInfoCompute[
                    r + last['row'][0] + '_' + (c + last['column'][0])
                  ].l,
                r:
                  borderInfoCompute[
                    r + last['row'][0] + '_' + (c + last['column'][0])
                  ].r,
                t:
                  borderInfoCompute[
                    r + last['row'][0] + '_' + (c + last['column'][0])
                  ].t,
                b:
                  borderInfoCompute[
                    r + last['row'][0] + '_' + (c + last['column'][0])
                  ].b,
              },
            }

            if (cfg['borderInfo'] == null) {
              cfg['borderInfo'] = []
            }

            cfg['borderInfo'].push(bd_obj)
          }

          let value = ''
          if (data[r] != null && data[r][c] != null) {
            value = data[r][c]
          }

          if (getObjType(value) == 'object' && 'mc' in value) {
            let mc = $.extend(true, {}, value['mc'])
            if ('rs' in value['mc']) {
              offsetMC[mc.r + '_' + mc.c] = [r + row_s, c + col_s]

              value['mc'].r = r + row_s
              value['mc'].c = c + col_s

              cfg['merge'][r + row_s + '_' + (c + col_s)] = value['mc']
            } else {
              value['mc'].r = offsetMC[mc.r + '_' + mc.c][0]
              value['mc'].c = offsetMC[mc.r + '_' + mc.c][1]
            }
          }
          d[r + row_s][c + col_s] = value
        }
      }

      if (RowlChange) {
        cfg = rowlenByRange(d, last['row'][0], last['row'][1], cfg)
        cfg = rowlenByRange(d, row_s, row_e, cfg)
      }

      //条件格式
      let cdformat = $.extend(
        true,
        [],
        Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)][
        'luckysheet_conditionformat_save'
        ]
      )
      if (cdformat != null && cdformat.length > 0) {
        for (let i = 0; i < cdformat.length; i++) {
          let cdformat_cellrange = cdformat[i].cellrange
          let emptyRange = []
          for (let j = 0; j < cdformat_cellrange.length; j++) {
            let range = conditionformat.CFSplitRange(
              cdformat_cellrange[j],
              { row: last['row'], column: last['column'] },
              { row: [row_s, row_e], column: [col_s, col_e] },
              'allPart'
            )
            emptyRange = emptyRange.concat(range)
          }
          cdformat[i].cellrange = emptyRange
        }
      }

      let rf
      if (
        Store.luckysheet_select_save[0].row_focus ==
        Store.luckysheet_select_save[0].row[0]
      ) {
        rf = row_s
      } else {
        rf = row_e
      }

      let cf
      if (
        Store.luckysheet_select_save[0].column_focus ==
        Store.luckysheet_select_save[0].column[0]
      ) {
        cf = col_s
      } else {
        cf = col_e
      }

      let range = []
      range.push({ row: last['row'], column: last['column'] })
      range.push({ row: [row_s, row_e], column: [col_s, col_e] })

      last['row'] = [row_s, row_e]
      last['column'] = [col_s, col_e]
      last['row_focus'] = rf
      last['column_focus'] = cf

      let allParam = {
        cfg: cfg,
        RowlChange: RowlChange,
        cdformat: cdformat,
      }

      jfrefreshgrid(d, range, allParam)

      selectHightlightShow()

      $('#luckysheet-sheettable').css('cursor', 'default')
      clearTimeout(Store.countfuncTimeout)
      Store.countfuncTimeout = setTimeout(function () {
        countfunc()
      }, 500)
    }

    //图表选区拖拽移动
    if (Store.chart_selection.rangeMove) {
      Store.chart_selection.rangeMoveDragged()
    }

    //图表选区拖拽拉伸
    if (!!Store.chart_selection.rangeResize) {
      Store.chart_selection.rangeResizeDragged()
    }

    //选区下拉
    if (Store.luckysheet_cell_selected_extend) {
      Store.luckysheet_cell_selected_extend = false
      $('#luckysheet-cell-selected-extend').hide()

      if (
        !checkProtectionLockedRangeList(
          Store.luckysheet_select_save,
          Store.currentSheetIndex
        )
      ) {
        return
      }

      let mouse = mouseposition(event.pageX, event.pageY)
      let scrollLeft = $('#luckysheet-cell-main').scrollLeft()
      let scrollTop = $('#luckysheet-cell-main').scrollTop()

      let x = mouse[0] + scrollLeft - 5
      let y = mouse[1] + scrollTop - 5

      let winH =
        $(window).height() +
        scrollTop -
        Store.sheetBarHeight -
        Store.statisticBarHeight,
        winW = $(window).width() + scrollLeft

      let row_location = rowLocation(y),
        row = row_location[1],
        row_pre = row_location[0],
        row_index = row_location[2]
      let col_location = colLocation(x),
        col = col_location[1],
        col_pre = col_location[0],
        col_index = col_location[2]

      let row_index_original = Store.luckysheet_cell_selected_extend_index[0],
        col_index_original = Store.luckysheet_cell_selected_extend_index[1]

      let last =
        Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1]
      let row_s = last['row'][0],
        row_e = last['row'][1]
      let col_s = last['column'][0],
        col_e = last['column'][1]

      if (row_s < 0 || y < 0) {
        row_s = 0
        row_e = last['row'][1] - last['row'][0]
      }

      if (col_s < 0 || x < 0) {
        col_s = 0
        col_e = last['column'][1] - last['column'][0]
      }

      if (
        row_e >= Store.visibledatarow[Store.visibledatarow.length - 1] ||
        y > winH
      ) {
        row_s =
          Store.visibledatarow.length - 1 - last['row'][1] + last['row'][0]
        row_e = Store.visibledatarow.length - 1
      }

      if (
        col_e >= Store.visibledatacolumn[Store.visibledatacolumn.length - 1] ||
        x > winW
      ) {
        col_s =
          Store.visibledatacolumn.length -
          1 -
          last['column'][1] +
          last['column'][0]
        col_e = Store.visibledatacolumn.length - 1
      }

      //复制范围
      luckysheetDropCell.copyRange = {
        row: $.extend(true, [], last['row']),
        column: $.extend(true, [], last['column']),
      }
      //applyType
      let typeItemHide = luckysheetDropCell.typeItemHide()

      if (
        !typeItemHide[0] &&
        !typeItemHide[1] &&
        !typeItemHide[2] &&
        !typeItemHide[3] &&
        !typeItemHide[4] &&
        !typeItemHide[5] &&
        !typeItemHide[6]
      ) {
        luckysheetDropCell.applyType = '0'
      } else {
        luckysheetDropCell.applyType = '1'
      }

      if (
        Math.abs(row_index_original - row_index) >
        Math.abs(col_index_original - col_index)
      ) {
        if (!(row_index >= row_s && row_index <= row_e)) {
          if (Store.luckysheet_select_save[0].top_move >= row_pre) {
            //当往上拖拽时
            luckysheetDropCell.applyRange = {
              row: [row_index, last['row'][0] - 1],
              column: last['column'],
            }
            luckysheetDropCell.direction = 'up'

            row_s -= last['row'][0] - row_index

            //是否有数据透视表范围
            if (pivotTable.isPivotRange(row_s, col_e)) {
              tooltip.info(locale_drag.affectPivot, '')
              return
            }
          } else {
            //当往下拖拽时
            luckysheetDropCell.applyRange = {
              row: [last['row'][1] + 1, row_index],
              column: last['column'],
            }
            luckysheetDropCell.direction = 'down'

            row_e += row_index - last['row'][1]

            //是否有数据透视表范围
            if (pivotTable.isPivotRange(row_e, col_e)) {
              tooltip.info(locale_drag.affectPivot, '')
              return
            }
          }
        } else {
          return
        }
      } else {
        if (!(col_index >= col_s && col_index <= col_e)) {
          if (Store.luckysheet_select_save[0].left_move >= col_pre) {
            //当往左拖拽时
            luckysheetDropCell.applyRange = {
              row: last['row'],
              column: [col_index, last['column'][0] - 1],
            }
            luckysheetDropCell.direction = 'left'

            col_s -= last['column'][0] - col_index

            //是否有数据透视表范围
            if (pivotTable.isPivotRange(row_e, col_s)) {
              tooltip.info(locale_drag.affectPivot, '')
              return
            }
          } else {
            //当往右拖拽时
            luckysheetDropCell.applyRange = {
              row: last['row'],
              column: [last['column'][1] + 1, col_index],
            }
            luckysheetDropCell.direction = 'right'

            col_e += col_index - last['column'][1]

            //是否有数据透视表范围
            if (pivotTable.isPivotRange(row_e, col_e)) {
              tooltip.info(locale_drag.affectPivot, '')
              return
            }
          }
        } else {
          return
        }
      }

      if (Store.config['merge'] != null) {
        let hasMc = false

        for (let r = last['row'][0]; r <= last['row'][1]; r++) {
          for (let c = last['column'][0]; c <= last['column'][1]; c++) {
            let cell = Store.flowdata[r][c]

            if (cell != null && cell.mc != null) {
              hasMc = true
              break
            }
          }
        }

        if (hasMc) {
          if (isEditMode()) {
            alert(locale_drag.noMerge)
          } else {
            tooltip.info(locale_drag.noMerge, '')
          }

          return
        }

        for (let r = row_s; r <= row_e; r++) {
          for (let c = col_s; c <= col_e; c++) {
            let cell = Store.flowdata[r][c]

            if (cell != null && cell.mc != null) {
              hasMc = true
              break
            }
          }
        }

        if (hasMc) {
          if (isEditMode()) {
            alert(locale_drag.noMerge)
          } else {
            tooltip.info(locale_drag.noMerge, '')
          }

          return
        }
      }

      last['row'] = [row_s, row_e]
      last['column'] = [col_s, col_e]

      luckysheetDropCell.update()
      luckysheetDropCell.createIcon()

      $('#luckysheet-cell-selected-move').hide()

      $('#luckysheet-sheettable').css('cursor', 'default')
      clearTimeout(Store.countfuncTimeout)
      Store.countfuncTimeout = setTimeout(function () {
        countfunc()
      }, 500)
    }
  })

  //禁止浏览器 右键默认菜单
  $('.luckysheet-grid-container, #luckysheet-rightclick-menu').on(
    'contextmenu',
    function (e) {
      e.preventDefault()
    }
  )

  // //禁止前台编辑(只可 框选单元格、滚动查看表格)
  // if(!Store.allowEdit){
  //     return;
  // }

  //选区拖动替换
  $('#luckysheet-cell-main div.luckysheet-cs-draghandle').mousedown(function (
    event
  ) {
    if (isEditMode() || Store.allowEdit === false) {
      //此模式下禁用选区拖动
      return
    }

    $('#luckysheet-cell-selected')
      .find('.luckysheet-cs-fillhandle')
      .css('cursor', 'move')
      .end()
      .find('.luckysheet-cs-draghandle')
      .css('cursor', 'move')
    $(
      '#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0'
    ).css('cursor', 'move')

    Store.luckysheet_cell_selected_move = true
    Store.luckysheet_scroll_status = true

    let mouse = mouseposition(event.pageX, event.pageY)
    let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
    let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

    let row_location = rowLocation(y),
      row_pre = row_location[0],
      row = row_location[1],
      row_index = row_location[2]
    let col_location = colLocation(x),
      col_pre = col_location[0],
      col = col_location[1],
      col_index = col_location[2]

    Store.luckysheet_cell_selected_move_index = [row_index, col_index]

    $('#luckysheet-cell-selected-move').css({
      left: col_pre,
      width: col - col_pre - 1,
      top: row_pre,
      height: row - row_pre - 1,
      display: 'block',
    })

    event.stopPropagation()
  })

  //选区下拉
  $('#luckysheet-cell-main div.luckysheet-cs-fillhandle')
    .mousedown(function (event) {
      if (isEditMode() || Store.allowEdit === false) {
        //此模式下禁用选区下拉
        return
      }

      $('#luckysheet-cell-selected')
        .find('.luckysheet-cs-fillhandle')
        .css('cursor', 'crosshair')
        .end()
        .find('.luckysheet-cs-draghandle')
        .css('cursor', 'crosshair')
      $(
        '#luckysheet-cell-main, #luckysheetTableContent, #luckysheet-sheettable_0'
      ).css('cursor', 'crosshair')

      Store.luckysheet_cell_selected_extend_time = setTimeout(function () {
        Store.luckysheet_cell_selected_extend = true
        Store.luckysheet_scroll_status = true

        let mouse = mouseposition(event.pageX, event.pageY)
        let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft() - 5
        let y = mouse[1] + $('#luckysheet-cell-main').scrollTop() - 5

        let row_location = rowLocation(y),
          row_pre = row_location[0],
          row = row_location[1],
          row_index = row_location[2]
        let col_location = colLocation(x),
          col_pre = col_location[0],
          col = col_location[1],
          col_index = col_location[2]

        Store.luckysheet_cell_selected_extend_index = [row_index, col_index]

        $('#luckysheet-cell-selected-extend').css({
          left: col_pre,
          width: col - col_pre - 1,
          top: row_pre,
          height: row - row_pre - 1,
          display: 'block',
        })
      }, 100)

      event.stopPropagation()
    })
    .click(function () {
      clearTimeout(Store.luckysheet_cell_selected_extend_time)
      event.stopPropagation()
    })
    .dblclick(function () {
      let last = Store.luckysheet_select_save[0]

      let r0 = last.row[0],
        r1 = last.row[1],
        c0 = last.column[0],
        c1 = last.column[1]

      if (pivotTable.isPivotRange(r0, c0)) {
        return
      }

      let dropCellState = false
      let step = 0

      for (let r = r1 + 1; r < Store.flowdata.length; r++) {
        if (c0 - 1 >= 0 && c1 + 1 < Store.flowdata[0].length) {
          let cell1 = Store.flowdata[r][c0 - 1]
          let cell2 = Store.flowdata[r][c1 + 1]

          if (r == r1 + 1) {
            if (
              (cell1 == null || isRealNull(cell1.v)) &&
              (cell2 == null || isRealNull(cell2.v))
            ) {
              dropCellState = false
              break
            } else {
              dropCellState = true
              step++
            }
          } else {
            if (
              (cell1 == null || isRealNull(cell1.v)) &&
              (cell2 == null || isRealNull(cell2.v))
            ) {
              break
            }

            step++
          }
        } else if (c0 - 1 >= 0) {
          let cell = Store.flowdata[r][c0 - 1]

          if (r == r1 + 1) {
            if (cell == null || isRealNull(cell.v)) {
              dropCellState = false
              break
            } else {
              dropCellState = true
              step++
            }
          } else {
            if (cell == null || isRealNull(cell.v)) {
              break
            }

            step++
          }
        } else if (c1 + 1 < Store.flowdata[0].length) {
          let cell = Store.flowdata[r][c1 + 1]

          if (r == r1 + 1) {
            if (cell == null || isRealNull(cell.v)) {
              dropCellState = false
              break
            } else {
              dropCellState = true
              step++
            }
          } else {
            if (cell == null || isRealNull(cell.v)) {
              break
            }

            step++
          }
        }
      }

      if (!dropCellState || step == 0) {
        event.stopPropagation()
        return
      }

      //复制范围
      luckysheetDropCell.copyRange = { row: [r0, r1], column: [c0, c1] }

      //applyType
      let typeItemHide = luckysheetDropCell.typeItemHide()

      if (
        !typeItemHide[0] &&
        !typeItemHide[1] &&
        !typeItemHide[2] &&
        !typeItemHide[3] &&
        !typeItemHide[4] &&
        !typeItemHide[5] &&
        !typeItemHide[6]
      ) {
        luckysheetDropCell.applyType = '0'
      } else {
        luckysheetDropCell.applyType = '1'
      }

      luckysheetDropCell.applyRange = {
        row: [r1 + 1, r1 + step],
        column: [c0, c1],
      }
      luckysheetDropCell.direction = 'down'

      Store.luckysheet_select_save = [
        { row: [r0, r1 + step], column: [c0, c1] },
      ]

      luckysheetDropCell.update()
      luckysheetDropCell.createIcon()

      $('#luckysheet-cell-selected-move').hide()

      $('#luckysheet-sheettable').css('cursor', 'default')
      clearTimeout(Store.countfuncTimeout)
      Store.countfuncTimeout = setTimeout(function () {
        countfunc()
      }, 500)

      event.stopPropagation()
    })

  //
  $(
    '#luckysheet-bottom-add-row, #luckysheet-bottom-add-row-input, #luckysheet-bottom-return-top'
  ).on('mousedown dblclick mouseup', function (e) {
    e.stopPropagation()
  })

  //底部添加行按钮
  $('#luckysheet-bottom-add-row').on('click', function (e) {
    $('#luckysheet-rightclick-menu').hide()
    luckysheetContainerFocus()

    let $t = $(this),
      value = $('#luckysheet-bottom-add-row-input').val()

    if (value == '') {
      value = luckysheetConfigsetting.addRowCount || 100
    }

    if (isNaN(parseInt(value))) {
      if (isEditMode()) {
        alert(locale_info.tipInputNumber)
      } else {
        tooltip.info('error', locale_info.tipInputNumber)
      }
      return
    }

    value = parseInt(value)
    if (value < 1 || value > 100) {
      if (isEditMode()) {
        alert(locale_info.tipInputNumberLimit)
      } else {
        tooltip.info('error', locale_info.tipInputNumberLimit)
      }
      return
    }

    luckysheetextendtable('row', Store.flowdata.length - 1, value)
  })

  $('#luckysheet-bottom-return-top').on('click', function (e) {
    $('#luckysheet-scrollbar-y').scrollTop(0)
  })

  //右键菜单 复制按钮
  $(
    '#luckysheet-copy-btn, #luckysheet-cols-copy-btn, #luckysheet-paste-btn-title'
  ).click(function (event) {
    $(this)
      .parent()
      .hide()
    //复制范围内包含部分合并单元格，提示
    if (Store.config['merge'] != null) {
      let has_PartMC = false

      for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
        let r1 = Store.luckysheet_select_save[s].row[0],
          r2 = Store.luckysheet_select_save[s].row[1]
        let c1 = Store.luckysheet_select_save[s].column[0],
          c2 = Store.luckysheet_select_save[s].column[1]

        has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2)

        if (has_PartMC) {
          break
        }
      }

      if (has_PartMC) {
        if (isEditMode()) {
          alert(locale_drag.noPartMerge)
        } else {
          tooltip.info(locale_drag.noPartMerge, '')
        }
        return
      }
    }

    //多重选区 有条件格式时 提示
    let cdformat =
      Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
        .luckysheet_conditionformat_save
    if (
      Store.luckysheet_select_save.length > 1 &&
      cdformat != null &&
      cdformat.length > 0
    ) {
      let hasCF = false

      let cf_compute = conditionformat.getComputeMap()

      label: for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
        if (hasCF) {
          break
        }

        let r1 = Store.luckysheet_select_save[s].row[0],
          r2 = Store.luckysheet_select_save[s].row[1]
        let c1 = Store.luckysheet_select_save[s].column[0],
          c2 = Store.luckysheet_select_save[s].column[1]

        for (let r = r1; r <= r2; r++) {
          for (let c = c1; c <= c2; c++) {
            if (conditionformat.checksCF(r, c, cf_compute) != null) {
              hasCF = true
              continue label
            }
          }
        }
      }

      if (hasCF) {
        if (isEditMode()) {
          alert(locale_drag.noMulti)
        } else {
          tooltip.info(locale_drag.noMulti, '')
        }
        return
      }
    }

    //多重选区 行不一样且列不一样时 提示
    if (Store.luckysheet_select_save.length > 1) {
      let isSameRow = true,
        str_r = Store.luckysheet_select_save[0].row[0],
        end_r = Store.luckysheet_select_save[0].row[1]
      let isSameCol = true,
        str_c = Store.luckysheet_select_save[0].column[0],
        end_c = Store.luckysheet_select_save[0].column[1]

      for (let s = 1; s < Store.luckysheet_select_save.length; s++) {
        if (
          Store.luckysheet_select_save[s].row[0] != str_r ||
          Store.luckysheet_select_save[s].row[1] != end_r
        ) {
          isSameRow = false
        }
        if (
          Store.luckysheet_select_save[s].column[0] != str_c ||
          Store.luckysheet_select_save[s].column[1] != end_c
        ) {
          isSameCol = false
        }
      }

      if ((!isSameRow && !isSameCol) || selectIsOverlap()) {
        if (isEditMode()) {
          alert(locale_drag.noMulti)
        } else {
          tooltip.info(locale_drag.noMulti, '')
        }
        return
      }
    }

    selection.copy(event)
  })

  //右键菜单 粘贴按钮
  $(
    '#luckysheet-copy-paste, #luckysheet-cols-paste-btn, #luckysheet-paste-btn-title'
  ).click(function (event) {
    selection.paste(event, 'btn')
    $(this)
      .parent()
      .hide()
  })

  //Menu bar, Chart button
  $('#luckysheet-chart-btn-title').click(function () {
    createLuckyChart()
  })

  // Right-click the menu, chart generation
  $('#luckysheetdatavisual').click(function () {
    createLuckyChart()
    $('#luckysheet-rightclick-menu').hide()
  })

  //菜单栏 数据透视表
  $('#luckysheet-pivot-btn-title').click(function (e) {
    if (
      !checkProtectionAuthorityNormal(
        Store.currentSheetIndex,
        'usePivotTablereports'
      )
    ) {
      return
    }
    pivotTable.createPivotTable(e)
  })

  //菜单栏 截图按钮
  $('#luckysheet-chart-btn-screenshot').click(function () {
    const locale_screenshot = _locale.screenshot
    if (Store.luckysheet_select_save.length == 0) {
      if (isEditMode()) {
        alert(locale_screenshot.screenshotTipNoSelection)
      } else {
        tooltip.info(
          locale_screenshot.screenshotTipTitle,
          locale_screenshot.screenshotTipNoSelection
        )
      }
      return
    }

    if (Store.luckysheet_select_save.length > 1) {
      if (isEditMode()) {
        alert(locale_screenshot.screenshotTipHasMulti)
      } else {
        tooltip.info(
          locale_screenshot.screenshotTipTitle,
          locale_screenshot.screenshotTipHasMulti
        )
      }

      return
    }

    //截图范围内包含部分合并单元格，提示
    if (Store.config['merge'] != null) {
      let has_PartMC = false

      for (let s = 0; s < Store.luckysheet_select_save.length; s++) {
        let r1 = Store.luckysheet_select_save[s].row[0],
          r2 = Store.luckysheet_select_save[s].row[1]
        let c1 = Store.luckysheet_select_save[s].column[0],
          c2 = Store.luckysheet_select_save[s].column[1]

        has_PartMC = hasPartMC(Store.config, r1, r2, c1, c2)

        if (has_PartMC) {
          break
        }
      }

      if (has_PartMC) {
        if (isEditMode()) {
          alert(locale_screenshot.screenshotTipHasMerge)
        } else {
          tooltip.info(
            locale_screenshot.screenshotTipTitle,
            locale_screenshot.screenshotTipHasMerge
          )
        }
        return
      }
    }

    let st_r = Store.luckysheet_select_save[0].row[0],
      ed_r = Store.luckysheet_select_save[0].row[1]
    let st_c = Store.luckysheet_select_save[0].column[0],
      ed_c = Store.luckysheet_select_save[0].column[1]

    let scrollHeight, rh_height
    if (st_r - 1 < 0) {
      scrollHeight = 0
      rh_height = Store.visibledatarow[ed_r]
    } else {
      scrollHeight = Store.visibledatarow[st_r - 1]
      rh_height = Store.visibledatarow[ed_r] - Store.visibledatarow[st_r - 1]
    }

    let scrollWidth, ch_width
    if (st_c - 1 < 0) {
      scrollWidth = 0
      ch_width = Store.visibledatacolumn[ed_c]
    } else {
      scrollWidth = Store.visibledatacolumn[st_c - 1]
      ch_width =
        Store.visibledatacolumn[ed_c] - Store.visibledatacolumn[st_c - 1]
    }

    let newCanvas = $('<canvas>')
      .attr({
        width: Math.ceil(ch_width * devicePixelRatio),
        height: Math.ceil(rh_height * devicePixelRatio),
      })
      .css({ width: ch_width, height: rh_height })

    luckysheetDrawMain(
      scrollWidth,
      scrollHeight,
      ch_width,
      rh_height,
      1,
      1,
      null,
      null,
      newCanvas
    )
    let ctx_newCanvas = newCanvas.get(0).getContext('2d')

    //补上 左边框和上边框
    ctx_newCanvas.beginPath()
    ctx_newCanvas.moveTo(0, 0)
    ctx_newCanvas.lineTo(0, Store.devicePixelRatio * rh_height)
    ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2
    ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle
    ctx_newCanvas.stroke()
    ctx_newCanvas.closePath()

    ctx_newCanvas.beginPath()
    ctx_newCanvas.moveTo(0, 0)
    ctx_newCanvas.lineTo(Store.devicePixelRatio * ch_width, 0)
    ctx_newCanvas.lineWidth = Store.devicePixelRatio * 2
    ctx_newCanvas.strokeStyle = luckysheetdefaultstyle.strokeStyle
    ctx_newCanvas.stroke()
    ctx_newCanvas.closePath()

    let image = new Image()
    let url = newCanvas.get(0).toDataURL('image/png')
    image.src = url

    if (ch_width > rh_height) {
      image.style.width = '100%'
    } else {
      image.style.height = '100%'
    }

    let maxHeight = $(window).height() - 200
    tooltip.screenshot(
      locale_screenshot.screenshotTipSuccess,
      '<div id="luckysheet-confirm-screenshot-save" style="height:' +
      maxHeight +
      'px;overflow:auto;"></div>',
      url
    )
    $('#luckysheet-confirm-screenshot-save').append(image)
    newCanvas.remove()
  })

  //截图下载
  $(document).on('click.luckysheetEvent', 'a.download', function () {
    let dataURI = $('#luckysheet-confirm-screenshot-save img').attr('src')
    const locale_screenshot = _locale.screenshot
    let binStr = atob(dataURI.split(',')[1]),
      len = binStr.length,
      arr = new Uint8Array(len)

    for (let i = 0; i < len; i++) {
      arr[i] = binStr.charCodeAt(i)
    }

    let blob = new Blob([arr])

    let element = document.createElement('a')
    element.setAttribute('href', URL.createObjectURL(blob))
    element.setAttribute(
      'download',
      locale_screenshot.screenshotImageName + '.png'
    )

    element.style.display = 'none'
    document.body.appendChild(element)

    element.click()

    let clickHandler
    element.addEventListener(
      'click',
      (clickHandler = function () {
        requestAnimationFrame(function () {
          URL.revokeObjectURL(element.href)
        })

        element.removeAttribute('href')
        element.removeEventListener('click', clickHandler)
      })
    )

    document.body.removeChild(element)
  })

  //菜单栏 分列按钮
  $('#luckysheet-splitColumn-btn-title').click(function () {
    if (!checkProtectionNotEnable(Store.currentSheetIndex)) {
      return
    }

    if (
      Store.luckysheet_select_save == null ||
      Store.luckysheet_select_save.length == 0
    ) {
      return
    }

    const locale_splitText = _locale.splitText

    if (Store.luckysheet_select_save.length > 1) {
      tooltip.info(locale_splitText.tipNoMulti, '')
      return
    }

    if (
      Store.luckysheet_select_save[0].column[0] !=
      Store.luckysheet_select_save[0].column[1]
    ) {
      tooltip.info(locale_splitText.tipNoMultiColumn, '')
      return
    }

    splitColumn.createDialog()
    splitColumn.init()
  })

  //菜单栏 插入图片按钮
  $('#luckysheet-insertImg-btn-title').click(function () {
    // *如果禁止前台编辑，则中止下一步操作
    if (!checkIsAllowEdit()) {
      tooltip.info('', locale().pivotTable.errorNotAllowEdit)
      return
    }
    if (
      !checkProtectionAuthorityNormal(Store.currentSheetIndex, 'editObjects')
    ) {
      return
    }
    $('#luckysheet-imgUpload').click()
  })
  $('#luckysheetInsertImage').click(function () {
    if (
      !checkProtectionAuthorityNormal(Store.currentSheetIndex, 'editObjects')
    ) {
      return
    }
    $('#luckysheet-imgUpload').click()
    $('#luckysheet-rightclick-menu').hide()
  })
  $('#luckysheet-imgUpload').click(function (e) {
    e.stopPropagation()
  })
  $('#luckysheet-imgUpload').on('change', function (e) {
    if (
      !checkProtectionAuthorityNormal(
        Store.currentSheetIndex,
        'editObjects',
        false
      )
    ) {
      return
    }
    let file = e.currentTarget.files[0]
    imageCtrl.insertImg(file)
  })

  //菜单栏 插入链接按钮
  $('#luckysheet-insertLink-btn-title').click(function () {
    // *如果禁止前台编辑，则中止下一步操作
    if (!checkIsAllowEdit()) {
      tooltip.info('', locale().pivotTable.errorNotAllowEdit)
      return
    }
    if (!checkProtectionNotEnable(Store.currentSheetIndex)) {
      return
    }

    if (
      Store.luckysheet_select_save == null ||
      Store.luckysheet_select_save.length == 0
    ) {
      return
    }

    hyperlinkCtrl.createDialog()
    hyperlinkCtrl.init()
  })
  $('#luckysheetInsertLink').click(function () {
    $('#luckysheet-insertLink-btn-title').click()
    $('#luckysheet-rightclick-menu').hide()
  })

  //菜单栏 数据验证按钮
  $('#luckysheet-dataVerification-btn-title').click(function () {
    if (!checkProtectionNotEnable(Store.currentSheetIndex)) {
      return
    }

    if (
      Store.luckysheet_select_save == null ||
      Store.luckysheet_select_save.length == 0
    ) {
      return
    }

    dataVerificationCtrl.createDialog()
    dataVerificationCtrl.init()
  })
  $('#luckysheetDataVerification').click(function () {
    $('#luckysheet-dataVerification-btn-title').click()
    $('#luckysheet-rightclick-menu').hide()
  })

  //Cell format
  $('#luckysheetCellFormatRightClickMenu').click(function () {
    openCellFormatModel()
  })

  //冻结行列
  $('#luckysheet-freezen-btn-horizontal').click(function () {
    if ($.trim($(this).text()) == locale().freezen.freezenCancel) {
      luckysheetFreezen.saveFrozen('freezenCancel')

      if (luckysheetFreezen.freezenverticaldata != null) {
        luckysheetFreezen.cancelFreezenVertical()
        luckysheetFreezen.createAssistCanvas()
        luckysheetrefreshgrid()
      }

      if (luckysheetFreezen.freezenhorizontaldata != null) {
        luckysheetFreezen.cancelFreezenHorizontal()
        luckysheetFreezen.createAssistCanvas()
        luckysheetrefreshgrid()
      }

      luckysheetFreezen.scrollAdapt()
      // cancel 之后 勾勾取消
      $('#luckysheet-icon-freezen-menu-menuButton')
        .find('.fa.fa-check')
        .remove()
    } else {
      luckysheetFreezen.saveFrozen('freezenRow')

      if (luckysheetFreezen.freezenverticaldata != null) {
        luckysheetFreezen.cancelFreezenVertical()
        luckysheetFreezen.createAssistCanvas()
        luckysheetrefreshgrid()
      }

      if (luckysheetFreezen.freezenhorizontaldata == null) {
        luckysheetFreezen.createFreezenHorizontal()
        luckysheetFreezen.createAssistCanvas()
      }
    }
  })

  $('#luckysheet-freezen-btn-vertical').click(function () {
    if (luckysheetFreezen.freezenverticaldata != null) {
      luckysheetFreezen.saveFrozen('freezenCancel')

      luckysheetFreezen.cancelFreezenVertical()
      luckysheetrefreshgrid()
    } else {
      luckysheetFreezen.saveFrozen('freezenColumn')

      luckysheetFreezen.createFreezenVertical()
    }
    luckysheetFreezen.createAssistCanvas()
  })

  $('#luckysheet-rightclick-menu input').on('keydown', function (e) {
    e.stopPropagation()
  })

  $('#luckysheet-modal-dialog-mask').on(
    'click dbclick mousedown mousemove mouseup',
    function (e) {
      e.stopPropagation()
      e.preventDefault()
    }
  )

  let copychange = function () {
    if (document.hidden || document.webkitHidden || document.msHidden) {
      Store.iscopyself = false
    }
  }

  $(document)
    .on(
      'visibilitychange.luckysheetEvent webkitvisibilitychange.luckysheetEvent msvisibilitychange.luckysheetEvent',
      copychange
    )
    .on('mouseleave.luckysheetEvent', function () {
      Store.iscopyself = false
    })
    .on('mousedown.luckysheetEvent', function (event) {
      //有批注在编辑时
      luckysheetPostil.removeActivePs()

      hideMenuByCancel(event)

      //点击功能栏时 如果是单元格编辑模式 则退出编辑模式
      if (
        $(event.target).closest('#luckysheet-wa-editor').length > 0 &&
        parseInt($('#luckysheet-input-box').css('top')) > 0
      ) {
        formula.updatecell(
          Store.luckysheetCellUpdate[0],
          Store.luckysheetCellUpdate[1]
        )
        luckysheetMoveHighlightCell('down', 0, 'rangeOfSelect')
      }
    })

  //表格左上角点击 全选表格
  $('#luckysheet-left-top').click(function (event) {
    if (!checkProtectionAllSelected(Store.currentSheetIndex)) {
      return
    }

    $('#luckysheet-wa-functionbox-confirm').click()
    Store.luckysheet_select_status = false

    Store.luckysheet_select_save = [
      {
        row: [0, Store.flowdata.length - 1],
        column: [0, Store.flowdata[0].length - 1],
        row_focus: 0,
        column_focus: 0,
        row_select: true,
        column_select: true,
      },
    ]
    selectHightlightShow()

    clearTimeout(Store.countfuncTimeout)
    Store.countfuncTimeout = setTimeout(function () {
      countfunc()
    }, 500)

    /* 选中区域：发送网络请求 */
    server.saveParam(
      'mv',
      Store.currentSheetIndex,
      Store.luckysheet_select_save
    )

    event.stopPropagation()
  })

  // 选择填报频率
  // $('#luckysheet-icon-fillingRate').click(function(event) {})

  //回退 重做 按钮
  $('#luckysheet-icon-undo').click(function (event) {
    if ($(this).hasClass('disabled')) {
      return
    }
    controlHistory.redo(event)
  })
  $('#luckysheet-icon-redo').click(function (event) {
    if ($(this).hasClass('disabled')) {
      return
    }
    controlHistory.undo(event)
  })

  //模态框拖动
  $(document).on(
    'mousedown.luckysheetEvent',
    'div.luckysheet-modal-dialog',
    function (e) {
      if (!$(e.target).is('.luckysheet-modal-dialog')) {
        return
      }

      Store.luckysheet_model_move_state = true

      Store.luckysheet_model_move_obj = $(e.currentTarget)
      let toffset = Store.luckysheet_model_move_obj.offset()
      Store.luckysheet_model_xy = [
        e.pageX - toffset.left,
        e.pageY - toffset.top,
      ]
    }
  )

  //模态框关闭
  $(document).on(
    'click.luckysheetEvent',
    '.luckysheet-modal-dialog-title-close, .luckysheet-model-close-btn',
    function (e) {
      //选择文本颜色和单元格颜色弹出框取消
      if (
        $('#textcolorselect').is(':visible') ||
        $('#cellcolorselect').is(':visible')
      ) {
        $('#luckysheet-conditionformat-dialog').show()
      }
      $(e.currentTarget)
        .parents('.luckysheet-modal-dialog')
        .hide()
      $('#luckysheet-modal-dialog-mask').hide()

      //函数查找功能所有弹出框关闭和取消
      if (
        $(this)
          .parents('.luckysheet-modal-dialog')
          .hasClass('luckysheet-search-formula')
      ) {
        formula.dontupdate()
        luckysheetMoveHighlightCell('down', 0, 'rangeOfSelect')
      }
      if (
        $(this)
          .parents('.luckysheet-modal-dialog')
          .hasClass('luckysheet-search-formula-parm')
      ) {
        formula.dontupdate()
        luckysheetMoveHighlightCell('down', 0, 'rangeOfSelect')
      }
      if (
        $(this)
          .parents('.luckysheet-modal-dialog')
          .hasClass('luckysheet-search-formula-parm-select')
      ) {
        formula.dontupdate()
        luckysheetMoveHighlightCell('down', 0, 'rangeOfSelect')
      }

      luckysheetContainerFocus()
    }
  )

  //左上角返回按钮
  $('#luckysheet_info_detail_title').click(function () {
    window.open(luckysheetConfigsetting.myFolderUrl, '_self')
  })

  //图表选区mousedown
  $('#luckysheet-chart-rangeShow').on(
    'mousedown.chartRangeShowMove',
    '.luckysheet-chart-rangeShow-move',
    function (event) {
      Store.chart_selection.rangeMove = true
      Store.luckysheet_scroll_status = true

      Store.chart_selection.rangeMoveObj = $(this).parent()

      let chart_json = Store.currentChart

      let $id = $(this)
        .parent()
        .attr('id')
      if ($id == 'luckysheet-chart-rangeShow-content') {
        let row_s =
          chart_json.rangeArray[0].row[0] +
          chart_json.rangeSplitArray.content.row[0]
        let col_s =
          chart_json.rangeArray[0].column[0] +
          chart_json.rangeSplitArray.content.column[0]

        Store.chart_selection.rangeMoveIndex = [row_s, col_s]
      } else if ($id == 'luckysheet-chart-rangeShow-rowtitle') {
        let row_s =
          chart_json.rangeArray[0].row[0] +
          chart_json.rangeSplitArray.rowtitle.row[0]
        let col_s =
          chart_json.rangeArray[0].column[0] +
          chart_json.rangeSplitArray.rowtitle.column[0]

        Store.chart_selection.rangeMoveIndex = [row_s, col_s]
      } else if ($id == 'luckysheet-chart-rangeShow-coltitle') {
        let row_s =
          chart_json.rangeArray[0].row[0] +
          chart_json.rangeSplitArray.coltitle.row[0]
        let col_s =
          chart_json.rangeArray[0].column[0] +
          chart_json.rangeSplitArray.coltitle.column[0]

        Store.chart_selection.rangeMoveIndex = [row_s, col_s]
      }

      let mouse = mouseposition(event.pageX, event.pageY)
      let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
      let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()
      let type = $(this).data('type')
      if (type == 'top') {
        y += 3
      } else if (type == 'right') {
        x -= 3
      } else if (type == 'bottom') {
        y -= 3
      } else if (type == 'left') {
        x += 3
      }

      let row_index = rowLocation(y)[2]
      let col_index = colLocation(x)[2]

      Store.chart_selection.rangeMovexy = [row_index, col_index]

      event.stopPropagation()
    }
  )

  $('#luckysheet-chart-rangeShow').on(
    'mousedown.chartRangeShowResize',
    '.luckysheet-chart-rangeShow-resize',
    function (event) {
      Store.chart_selection.rangeResize = $(this).data('type') //开始状态resize
      Store.luckysheet_scroll_status = true

      Store.chart_selection.rangeResizeObj = $(this).parent()

      let chart_json = Store.currentChart
      let row_s
      let row_e
      let col_s
      let col_e

      let $id = $(this)
        .parent()
        .attr('id')
      if ($id == 'luckysheet-chart-rangeShow-content') {
        if (chart_json.rangeRowCheck.exits) {
          row_s =
            chart_json.rangeArray[0].row[0] +
            chart_json.rangeSplitArray.content.row[0]
          row_e =
            chart_json.rangeArray[0].row[0] +
            chart_json.rangeSplitArray.content.row[1]
        } else {
          row_s = chart_json.rangeSplitArray.content.row[0]
          row_e = chart_json.rangeSplitArray.content.row[0]
        }

        if (chart_json.rangeColCheck.exits) {
          col_s =
            chart_json.rangeArray[0].column[0] +
            chart_json.rangeSplitArray.content.column[0]
          col_e =
            chart_json.rangeArray[0].column[0] +
            chart_json.rangeSplitArray.content.column[1]
        } else {
          col_s = chart_json.rangeSplitArray.content.column[0]
          col_e = chart_json.rangeSplitArray.content.column[1]
        }

        Store.chart_selection.rangeResizeIndex = {
          row: [row_s, row_e],
          column: [col_s, col_e],
        }
      } else if ($id == 'luckysheet-chart-rangeShow-rowtitle') {
        let row_s =
          chart_json.rangeArray[0].row[0] +
          chart_json.rangeSplitArray.rowtitle.row[0]
        let row_e =
          chart_json.rangeArray[0].row[0] +
          chart_json.rangeSplitArray.rowtitle.row[1]

        let col_s =
          chart_json.rangeArray[0].column[0] +
          chart_json.rangeSplitArray.rowtitle.column[0]
        let col_e =
          chart_json.rangeArray[0].column[0] +
          chart_json.rangeSplitArray.rowtitle.column[1]

        Store.chart_selection.rangeResizeIndex = {
          row: [row_s, row_e],
          column: [col_s, col_e],
        }
      } else if ($id == 'luckysheet-chart-rangeShow-coltitle') {
        let row_s =
          chart_json.rangeArray[0].row[0] +
          chart_json.rangeSplitArray.coltitle.row[0]
        let row_e =
          chart_json.rangeArray[0].row[0] +
          chart_json.rangeSplitArray.coltitle.row[1]

        let col_s =
          chart_json.rangeArray[0].column[0] +
          chart_json.rangeSplitArray.coltitle.column[0]
        let col_e =
          chart_json.rangeArray[0].column[0] +
          chart_json.rangeSplitArray.coltitle.column[1]

        Store.chart_selection.rangeResizeIndex = {
          row: [row_s, row_e],
          column: [col_s, col_e],
        }
      }

      let mouse = mouseposition(event.pageX, event.pageY)
      let x = mouse[0] + $('#luckysheet-cell-main').scrollLeft()
      let y = mouse[1] + $('#luckysheet-cell-main').scrollTop()

      if (Store.chart_selection.rangeResize == 'lt') {
        x += 3
        y += 3
      } else if (Store.chart_selection.rangeResize == 'lb') {
        x += 3
        y -= 3
      } else if (Store.chart_selection.rangeResize == 'rt') {
        x -= 3
        y += 3
      } else if (Store.chart_selection.rangeResize == 'rb') {
        x -= 3
        y -= 3
      }

      let row_index = rowLocation(y)[2]
      let col_index = colLocation(x)[2]

      Store.chart_selection.rangeResizexy = [row_index, col_index]

      event.stopPropagation()
    }
  )

  $('#luckysheet-wa-calculate-size').mousedown(function (e) {
    let y = e.pageY
    formula.functionResizeData.y = y
    formula.functionResizeStatus = true
    formula.functionResizeData.calculatebarHeight = Store.calculatebarHeight
    if (formula.rangetosheet != null) {
      formula.updatecell(
        Store.luckysheetCellUpdate[0],
        Store.luckysheetCellUpdate[1]
      )
    }
  })

  // 点击设置字体大小的下拉箭头，把自动聚焦输入框去除（认为下拉设置字体大小，不需要聚焦输入框）
  // //toolbar菜单
  // $("#" + Store.container + " .luckysheet-wa-editor").on("click", ".luckysheet-toolbar-zoom-combobox", function (e) {
  //     $(e.currentTarget).addClass("luckysheet-toolbar-combo-button-open");
  //     $(e.currentTarget).find(".luckysheet-toolbar-combo-button-input").focus();
  // });

  // $("#" + Store.container + " .luckysheet-wa-editor").on("blur", ".luckysheet-toolbar-combo-button-input", function (e) {
  //     $(e.currentTarget).closest(".luckysheet-toolbar-zoom-combobox").removeClass("luckysheet-toolbar-combo-button-open");
  // });

  //表格格式处理
  menuButton.initialMenuButton()

  let dpi_x =
    document.getElementById('testdpidiv').offsetWidth * Store.devicePixelRatio
  let dpi_y =
    document.getElementById('testdpidiv').offsetHeight * Store.devicePixelRatio

  //粘贴事件处理
  $(document).on('paste.luckysheetEvent', function (e) {
    if (isEditMode()) {
      //此模式下禁用粘贴
      return
    }
    if (selection.isPasteAction) {
      $('#luckysheet-rich-text-editor').blur()
      selection.isPasteAction = false

      let clipboardData = window.clipboardData //for IE
      if (!clipboardData) {
        // for chrome
        clipboardData = e.originalEvent.clipboardData
      }

      let txtdata =
        clipboardData.getData('text/html') ||
        clipboardData.getData('text/plain')

      //如果标示是qksheet复制的内容，判断剪贴板内容是否是当前页面复制的内容
      let isEqual = true
      if (
        txtdata.indexOf('luckysheet_copy_action_table') > -1 &&
        Store.luckysheet_copy_save['copyRange'] != null &&
        Store.luckysheet_copy_save['copyRange'].length > 0
      ) {
        //剪贴板内容解析
        let cpDataArr = []

        let reg = new RegExp('<tr.*?>(.*?)</tr>', 'gs')
        let reg2 = new RegExp('<td.*?>(.*?)</td>', 'gs')

        let regArr = txtdata.match(reg) || []

        for (let i = 0; i < regArr.length; i++) {
          let cpRowArr = []

          let reg2Arr = regArr[i].match(reg2)

          if (reg2Arr != null) {
            for (let j = 0; j < reg2Arr.length; j++) {
              let cpValue = reg2Arr[j]
                .replace(/<td.*?>/gs, '')
                .replace(/<\/td>/gs, '')
              cpRowArr.push(cpValue)
            }
          }

          cpDataArr.push(cpRowArr)
        }

        //当前页面复制区内容
        let copy_r1 = Store.luckysheet_copy_save['copyRange'][0].row[0],
          copy_r2 = Store.luckysheet_copy_save['copyRange'][0].row[1],
          copy_c1 = Store.luckysheet_copy_save['copyRange'][0].column[0],
          copy_c2 = Store.luckysheet_copy_save['copyRange'][0].column[1]

        let copy_index = Store.luckysheet_copy_save['dataSheetIndex']

        let d
        if (copy_index == Store.currentSheetIndex) {
          d = editor.deepCopyFlowData(Store.flowdata)
        } else {
          d = Store.luckysheetfile[getSheetIndex(copy_index)].data
        }

        for (let r = copy_r1; r <= copy_r2; r++) {
          if (r - copy_r1 > cpDataArr.length - 1) {
            break
          }

          for (let c = copy_c1; c <= copy_c2; c++) {
            let cell = d[r][c]
            let isInlineStr = false
            if (cell != null && cell.mc != null && cell.mc.rs == null) {
              continue
            }

            let v
            if (cell != null) {
              if (cell.ct != null && cell.ct.fa.indexOf('w') > -1) {
                v = d[r][c].v
              } else {
                v = d[r][c].m
              }
            } else {
              v = ''
            }

            if (
              v == null &&
              d[r][c] &&
              d[r][c].ct &&
              d[r][c].ct.t == 'inlineStr'
            ) {
              v = d[r][c].ct.s.map((val) => val.v).join('')
              isInlineStr = true
            }
            if (v == null) {
              v = ''
            }
            if (isInlineStr) {
              const cpData = $(cpDataArr[r - copy_r1][c - copy_c1])
                .text()
                .replace(/\s|\n/g, ' ')
              const storeValue = v.replace(/\n/g, '').replace(/\s/g, ' ')
              if (cpData != storeValue) {
                isEqual = false
                break
              }
            } else {
              if (cpDataArr[r - copy_r1][c - copy_c1] != v) {
                isEqual = false
                break
              }
            }
          }
        }
      }

      const locale_fontjson = locale().fontjson

      // hook
      if (
        !method.createHookFunction(
          'rangePasteBefore',
          Store.luckysheet_select_save,
          txtdata
        )
      ) {
        return
      }

      if (
        txtdata.indexOf('luckysheet_copy_action_table') > -1 &&
        Store.luckysheet_copy_save['copyRange'] != null &&
        Store.luckysheet_copy_save['copyRange'].length > 0 &&
        isEqual
      ) {
        //剪切板内容 和 luckysheet本身复制的内容 一致
        if (Store.luckysheet_paste_iscut) {
          Store.luckysheet_paste_iscut = false
          selection.pasteHandlerOfCutPaste(Store.luckysheet_copy_save)
          selection.clearcopy(e)
        } else {
          selection.pasteHandlerOfCopyPaste(Store.luckysheet_copy_save)
        }
      } else if (txtdata.indexOf('luckysheet_copy_action_image') > -1) {
        imageCtrl.pasteImgItem()
      } else {
        if (txtdata.indexOf('table') > -1) {
          $('#luckysheet-copy-content').html(txtdata)

          let data = new Array(
            $('#luckysheet-copy-content').find('table tr').length
          )
          let colLen = 0
          $('#luckysheet-copy-content')
            .find('table tr')
            .eq(0)
            .find('td')
            .each(function () {
              let colspan = parseInt($(this).attr('colspan'))
              if (isNaN(colspan)) {
                colspan = 1
              }
              colLen += colspan
            })

          for (let i = 0; i < data.length; i++) {
            data[i] = new Array(colLen)
          }

          let r = 0
          let borderInfo = {}
          $('#luckysheet-copy-content')
            .find('table tr')
            .each(function () {
              let $tr = $(this)
              let c = 0
              $tr.find('td').each(function () {
                let $td = $(this)
                let cell = {}
                let txt = $td.text()
                if ($.trim(txt).length == 0) {
                  cell.v = null
                  cell.m = ''
                } else {
                  let mask = genarate($td.text())
                  cell.v = mask[2]
                  cell.ct = mask[1]
                  cell.m = mask[0]
                }

                let bg = $td.css('background-color')
                if (bg == 'rgba(0, 0, 0, 0)') {
                  bg = null
                }

                cell.bg = bg

                let bl = $td.css('font-weight')
                if (bl == 400 || bl == 'normal') {
                  cell.bl = 0
                } else {
                  cell.bl = 1
                }

                // 检测下划线
                let un = $td.css('text-decoration')
                if (un.indexOf('underline') != -1) {
                  cell.un = 1
                }

                let it = $td.css('font-style')
                if (it == 'normal') {
                  cell.it = 0
                } else {
                  cell.it = 1
                }

                let ff = $td.css('font-family')
                let ffs = ff.split(',')
                for (let i = 0; i < ffs.length; i++) {
                  let fa = $.trim(ffs[i].toLowerCase())
                  fa = locale_fontjson[fa]
                  if (fa == null) {
                    cell.ff = 0
                  } else {
                    cell.ff = fa
                    break
                  }
                }
                let fs = Math.round((parseInt($td.css('font-size')) * 72) / 96)
                cell.fs = fs

                let fc = $td.css('color')
                cell.fc = fc

                // 水平对齐属性
                let ht = $td.css('text-align')
                if (ht == 'center') {
                  cell.ht = 0
                } else if (ht == 'right') {
                  cell.ht = 2
                } else {
                  cell.ht = 1
                }

                // 垂直对齐属性
                let vt = $td.css('vertical-align')
                if (vt == 'middle') {
                  cell.vt = 0
                } else if (vt == 'top' || vt == 'text-top') {
                  cell.vt = 1
                } else {
                  cell.vt = 2
                }

                while (c < colLen && data[r][c] != null) {
                  c++
                }

                if (c == colLen) {
                  return true
                }
                if (data[r][c] == null) {
                  data[r][c] = cell
                  let rowspan = parseInt($td.attr('rowspan'))
                  let colspan = parseInt($td.attr('colspan'))

                  if (isNaN(rowspan)) {
                    rowspan = 1
                  }

                  if (isNaN(colspan)) {
                    colspan = 1
                  }

                  let r_ab = Store.luckysheet_select_save[0]['row'][0] + r
                  let c_ab = Store.luckysheet_select_save[0]['column'][0] + c

                  for (let rp = 0; rp < rowspan; rp++) {
                    for (let cp = 0; cp < colspan; cp++) {
                      if (rp == 0) {
                        let bt = $td.css('border-top')
                        if (
                          bt != null &&
                          bt.length > 0 &&
                          bt.substr(0, 3).toLowerCase() != '0px'
                        ) {
                          let width = $td.css('border-top-width')
                          let type = $td.css('border-top-style')
                          let color = $td.css('border-top-color')
                          let borderconfig = menuButton.getQKBorder(
                            width,
                            type,
                            color
                          )

                          if (borderInfo[r + rp + '_' + (c + cp)] == null) {
                            borderInfo[r + rp + '_' + (c + cp)] = {}
                          }

                          borderInfo[r + rp + '_' + (c + cp)].t = {
                            style: borderconfig[0],
                            color: borderconfig[1],
                          }
                        }
                      }

                      if (rp == rowspan - 1) {
                        let bb = $td.css('border-bottom')
                        if (
                          bb != null &&
                          bb.length > 0 &&
                          bb.substr(0, 3).toLowerCase() != '0px'
                        ) {
                          let width = $td.css('border-bottom-width')
                          let type = $td.css('border-bottom-style')
                          let color = $td.css('border-bottom-color')
                          let borderconfig = menuButton.getQKBorder(
                            width,
                            type,
                            color
                          )

                          if (borderInfo[r + rp + '_' + (c + cp)] == null) {
                            borderInfo[r + rp + '_' + (c + cp)] = {}
                          }

                          borderInfo[r + rp + '_' + (c + cp)].b = {
                            style: borderconfig[0],
                            color: borderconfig[1],
                          }
                        }
                      }

                      if (cp == 0) {
                        let bl = $td.css('border-left')
                        if (
                          bl != null &&
                          bl.length > 0 &&
                          bl.substr(0, 3).toLowerCase() != '0px'
                        ) {
                          let width = $td.css('border-left-width')
                          let type = $td.css('border-left-style')
                          let color = $td.css('border-left-color')
                          let borderconfig = menuButton.getQKBorder(
                            width,
                            type,
                            color
                          )

                          if (borderInfo[r + rp + '_' + (c + cp)] == null) {
                            borderInfo[r + rp + '_' + (c + cp)] = {}
                          }

                          borderInfo[r + rp + '_' + (c + cp)].l = {
                            style: borderconfig[0],
                            color: borderconfig[1],
                          }
                        }
                      }

                      if (cp == colspan - 1) {
                        let br = $td.css('border-right')
                        if (
                          br != null &&
                          br.length > 0 &&
                          br.substr(0, 3).toLowerCase() != '0px'
                        ) {
                          let width = $td.css('border-right-width')
                          let type = $td.css('border-right-style')
                          let color = $td.css('border-right-color')
                          let borderconfig = menuButton.getQKBorder(
                            width,
                            type,
                            color
                          )

                          if (borderInfo[r + rp + '_' + (c + cp)] == null) {
                            borderInfo[r + rp + '_' + (c + cp)] = {}
                          }

                          borderInfo[r + rp + '_' + (c + cp)].r = {
                            style: borderconfig[0],
                            color: borderconfig[1],
                          }
                        }
                      }

                      if (rp == 0 && cp == 0) {
                        continue
                      }
                      data[r + rp][c + cp] = { mc: { r: r_ab, c: c_ab } }
                    }
                  }

                  if (rowspan > 1 || colspan > 1) {
                    let first = { rs: rowspan, cs: colspan, r: r_ab, c: c_ab }
                    data[r][c].mc = first
                  }
                }

                c++

                if (c == colLen) {
                  return true
                }
              })

              r++
            })

          Store.luckysheet_selection_range = []
          selection.pasteHandler(data, borderInfo)
          $('#luckysheet-copy-content').empty()
        }
        //复制的是图片
        else if (
          clipboardData.files.length == 1 &&
          clipboardData.files[0].type.indexOf('image') > -1
        ) {
          imageCtrl.insertImg(clipboardData.files[0])

          return
        } else {
          txtdata = clipboardData.getData('text/plain')
          selection.pasteHandler(txtdata)
        }
      }
    } else if ($(e.target).closest('#luckysheet-rich-text-editor').length > 0) {
      // 阻止默认粘贴
      e.preventDefault()

      let clipboardData = window.clipboardData //for IE
      if (!clipboardData) {
        // for chrome
        clipboardData = e.originalEvent.clipboardData
      }
      let text = clipboardData.getData('text/plain')
      // 插入
      document.execCommand('insertText', false, text)
    }
  })

  //是否允许加载下一页
  if (luckysheetConfigsetting.enablePage) {
    $('#luckysheet-bottom-page-next')
      .click(function () {
        let queryExps = luckysheetConfigsetting.pageInfo.queryExps
        let reportId = luckysheetConfigsetting.pageInfo.reportId
        let fields = luckysheetConfigsetting.pageInfo.fields
        let mobile = luckysheetConfigsetting.pageInfo.mobile
        let frezon = luckysheetConfigsetting.pageInfo.frezon
        let currentPage = luckysheetConfigsetting.pageInfo.currentPage
        let totalPage = luckysheetConfigsetting.pageInfo.totalPage
        let pageUrl = luckysheetConfigsetting.pageInfo.pageUrl

        method.addDataAjax(
          {
            queryExps: queryExps,
            reportId: reportId,
            fields: fields,
            mobile: mobile,
            frezon: frezon,
            pageIndex: currentPage,
            currentPage: currentPage,
          },
          Store.currentSheetIndex,
          pageUrl,
          function () {
            luckysheetConfigsetting.pageInfo.currentPage++
            if (
              luckysheetConfigsetting.pageInfo.totalPage ==
              luckysheetConfigsetting.pageInfo.currentPage
            ) {
              $('#luckysheet-bottom-page-next').hide()
              let pageInfoFull = replaceHtml(locale_info.pageInfoFull, {
                total: luckysheetConfigsetting.total,
                totalPage: luckysheetConfigsetting.pageInfo.totalPage,
              })
              $('#luckysheet-bottom-page-info').html(pageInfoFull)
            } else {
              let pageInfo = replaceHtml(locale_info.pageInfo, {
                total: luckysheetConfigsetting.total,
                totalPage: luckysheetConfigsetting.pageInfo.totalPage,
                currentPage: luckysheetConfigsetting.pageInfo.currentPage,
              })
              $('#luckysheet-bottom-page-info').html(pageInfo)
            }
          }
        )
      })
      .mousedown(function (e) {
        e.stopPropagation()
      })
  }

  //回到顶部
  $('#luckysheet-bottom-bottom-top')
    .click(function () {
      $('#luckysheet-scrollbar-y').scrollTop(0)
    })
    .mousedown(function (e) {
      e.stopPropagation()
    })

  $(
    '#luckysheet-wa-editor,#luckysheet-icon-morebtn-div,.luckysheet-toolbar-button'
  ).click(function (e) {
    if (
      this.id != 'luckysheet-icon-paintformat' &&
      menuButton.luckysheetPaintModelOn
    ) {
      menuButton.cancelPaintModel()
    }
  })
  $('#fillingRateDom').focus(function () {
    setRangeShow('A1', { show: false })
    exitEditMode()
    $('#luckysheet-input-box').css('display', 'none')
  })
  $('#fillingRateDomB').focus(function () {
    setRangeShow('A1', { show: false })
    exitEditMode()
    $('#luckysheet-input-box').css('display', 'none')
  })
  $('#fillingRateDomB').blur(function () {
    fillingChangeRate()
  })

  // 填报频率值改变事件
  $('#fillingRateDom').change(function () {
    fillingChangeRate()
  })
  $('#yearQuarterLucky .reta-btn').click(function () {
    fillingChangeRate()
  })
}

// 协同编辑其他用户不在操作的时候，且已经展示了用户名10秒，则用户名框隐藏
function hideUsername() {
  let $showEle = $$('.luckysheet-multipleRange-show')

  if ($showEle.length === undefined) {
    $showEle = [$showEle]
  }

  $showEle.forEach((ele) => {
    const id = ele.id.replace('luckysheet-multipleRange-show-', '')

    if (Store.cooperativeEdit.usernameTimeout['user' + id] === null) {
      $$('.username', ele).style.display = 'none'
    }
  })
}

export const fillingChangeRate = function () {
  const val = $('#fillingRateDom').val() || $('#fillingRateDomB').val()
  let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)]
  if (!val || val === file.rateValue) return
  if (
    luckysheetConfigsetting &&
    luckysheetConfigsetting.hook &&
    luckysheetConfigsetting.hook.fillingRateChange
  ) {
    luckysheetConfigsetting.hook.fillingRateChange(val)
  }
}
